sourcecode

다중 사이트의 WordPress cron을 대체하기 위해 PHP 스크립트가 작동하지 않습니다.

codebag 2023. 10. 20. 13:39
반응형

다중 사이트의 WordPress cron을 대체하기 위해 PHP 스크립트가 작동하지 않습니다.

저는 제 멀티 사이트를 위해 워드프레스 크론을 서버 크론으로 교체하려고 합니다.각 사이트마다 cron 항목을 추가해야 할 것 같아요. 관리 악몽이 될 수도 있습니다.대신 각 하위 사이트에 대해 cron을 호출하는 단일 cron 작업을 실행합니다.아래는 플러그인 스크립트이지만 오류 500이 발생합니다.오류 메시지는 fmpeg가 설치되지 않았다는 내용을 담고 있으므로 오해의 소지가 있으며 부정확합니다(다른 오류 메시지는 없음).누가 제가 이것을 바로잡는 것을 도와주실 수 있나요?플러그인은 GitHub(https://github.com/chibani/wp_multisite_cron) 에 있지만 커뮤니티를 위한 훌륭한 플러그인이 될 것이라고 생각합니다.도와주셔서 감사합니다!

register_activation_hook(__FILE__, array('wp_multisite_cron','plugin_activation'));
add_action('init', array('wp_multisite_cron', 'init'));

class wp_multisite_cron{

    const LANG = 'wp_multisite_cron';
    const LANG_DIR = '/lang/';

    /**
     * 
     * Plugin activation (sets default parameters)
     */
    public static function plugin_activation(){
        if(!self::get_option('concurrent_crons'))
            self::update_option('concurrent_crons', 100);
    }

    /**
     * 
     * The main 'loader'
     */
    public static function init() {

        //Setup the translation
        load_plugin_textdomain(self::LANG, false, dirname(plugin_basename( __FILE__ ) ) . self::LANG_DIR);

        //The multisite cron action     
        add_action('wp_ajax_wp_multisite_cron_call', array('wp_multisite_cron','cron_call'));
        add_action('wp_ajax_nopriv_wp_multisite_cron_call', array('wp_multisite_cron','cron_call'));

        // admin actions and hooks
        if (is_admin()) {
            self::admin_hooks();
        }
    }

    /**
     * 
     * The admin hooks
     */
    public static function admin_hooks(){
        //Setting menu
        add_action('admin_menu', array('wp_multisite_cron', 'admin_menu'));
        if(is_network_admin() && self::is_ready()){
            add_action('network_admin_menu', array('wp_multisite_cron', 'network_admin_menu'));
        }
    }

    /**
     * 
     * Set up the admin menu(s)
     */
    public static function admin_menu(){
        add_options_page("WordPress multisite cron, information page", "WP multisite cron", 'manage_options', 'wp_multisite_cron_settings', array('wp_multisite_cron', "admin_settings"));
    }

    /**
     * 
     * Set up the admin menu(s)
     */
    public static function network_admin_menu(){
        add_submenu_page("settings.php","WordPress multisite cron, information page", "WP multisite cron", 'manage_options', 'wp_multisite_cron_settings', array('wp_multisite_cron', "admin_settings"));
    }


    /**
     * 
     * The admin settings page
     */
    public static function admin_settings(){
        ?>
        <div class="wrap">
            <div id="icon-options-general" class="icon32">
                <br />
            </div>
            <h2>WordPress multisite cron</h2>

            <?php if (isset($_POST['wp_multisite_cron']) && !empty($_POST['wp_multisite_cron'])) :

                if (isset($_POST['_wpnonce']) && wp_verify_nonce( $_POST['_wpnonce'], plugin_basename( __FILE__ ) )) :
                    self::delete_option('concurrent_crons');

                    foreach($_POST['wp_multisite_cron'] as $option_name=>$option_value){
                        self::update_option($option_name, $option_value);
                    }
                ?>
                    <div id="setting-error-settings_updated" class="updated settings-error">
                        <p>
                            <strong><?php _e('Settings saved.')?></strong>
                        </p>
                    </div>
                <?php else: ?>
                    <div id="message" class="error fade">
                        <p><?php _e('Unable to update settings.',self::LANG)?></p>
                    </div>
                <?php endif;?>
            <?php endif;?>



            <?php if(!is_multisite()):?>
                <div class="tool-box error">
                    <h3><?php _e('Multisite',self::LANG) ?></h3>
                    <p><?php _e('Your WordPress installation is not configured as multisite',self::LANG) ?>.</p>
                    <p><?php _e("Read the WordPress' documentation about multisite to learn how to set up multisite",self::LANG)?> : <a href="http://codex.wordpress.org/Create_A_Network" target="_blank"><?php _e('here',self::LANG)?></a></p>
                </div>
            <?php endif;?>


            <?php if(!defined('DISABLE_WP_CRON') || !DISABLE_WP_CRON ):?>
                <div class="tool-box error">
                    <h3><?php _e('WordPress default cron system',self::LANG) ?></h3>
                    <p><?php _e('You must disable the WordPress cron system, to use this extension',self::LANG) ?>.</p>
                    <p><?php _e('Add the following code in your wp-config.php',self::LANG) ?> :</p>
                    <p>
                        <code>define('DISABLE_WP_CRON', true);</code>
                    </p>
                </div>
            <?php endif;?>

            <form action="" method="post">
                <table class="form-table">
                    <tbody>
                        <tr valign="top">
                            <th scope="row">
                                <label for="concurrent_crons"><?php _e('Concurrent crons',self::LANG) ?></label><br />
                                <em><?php _e("Lower it if some of your sites' cron don't run",self::LANG)?></em>
                            </th>
                            <td>
                                <input type="text" name="wp_multisite_cron[concurrent_crons]" id="concurrent_crons" value="<?php echo self::get_option('concurrent_crons') ?>" />
                            </td>
                        </tr>
                    </tbody>
                </table>
                <p class="submit">
                    <input class="button-primary" name="plugin_ok" value="<?php _e('Save settings',self::LANG) ?>" type="submit" />
                </p>
                <?php wp_nonce_field( plugin_basename( __FILE__ ), '_wpnonce' );?>
            </form>


            <?php if(self::is_ready()): ?>
                <div class="tool-box">
                    <h3><?php _e('Set-up WordPress multisite cron',self::LANG) ?></h3>
                    <p><?php _e('Add the following line in your crontab',self::LANG)?> :</p>
                    <p>
                        <code>*/15 *<?php echo "\t" ?>* * * www-data /usr/bin/wget -qO- <?php echo admin_url('admin-ajax.php','http').'?action=wp_multisite_cron_call' ?></code>
                    </p>
                </div>
            <?php endif;?>
        </div>

        <?php 
    }

    /**
     * 
     * Check wether the config is ok to run real crons
     */
    public static function is_ready(){
        return (is_multisite() && defined('DISABLE_WP_CRON') && DISABLE_WP_CRON);
    }

    /**
     * 
     * The real cron
     */
    public static function cron_call(){

        //load the blogs id
        $blogs = self::get_blogs_id();
        if(count($blogs)){
            $mh = curl_multi_init();

            $length = self::get_option('concurrent_crons');
            $offset = 0;

            //Cut the 
            while($blogs_slice = array_slice($blogs,$offset,$length)){

                $offset += $length;

                foreach($blogs_slice as &$blog_id){
                    switch_to_blog($blog_id);
                    $cron_url = site_url().'/wp-cron.php?doing_wp_cron';

                    //Add the url to the stack
                    $chs[$blog_id]=curl_init();
                    curl_setopt($chs[$blog_id], CURLOPT_URL, $cron_url);
                    curl_setopt($chs[$blog_id], CURLOPT_HEADER, 0);
                    curl_multi_add_handle($mh, $ch);
                }

                //Launch :)
                $running = null;
                do{
                    curl_multi_exec($mh, $still_running);
                }while($still_running > 0);

                curl_multi_close($mh);
            }
        }
        die();
    }

    /**
     * 
     * Get the blog_id for each active blog in the multisite
     * @return array
     */
    public static function get_blogs_id(){
        global $wpdb;

        //Get the blogs' ids for blogs that are public and active
        $blogs = $wpdb->get_col('SELECT blog_id FROM '.$wpdb->blogs.' WHERE public=1 AND deleted=0');
        return $blogs;
    }

    /**
     * 
     * Get a plugin's specific option
     * @param string $option_name
     */
    public static function get_option($option_name){
        return get_option('wp_multisite_cron_'.$option_name);
    }

    /**
     * 
     * Set a plugin's specific option
     * @param unknown_type $option_name
     */
    public static function update_option($option_name,$option_value){
        return update_option('wp_multisite_cron_'.$option_name,$option_value);
    }

    /**
     * 
     * Delete a plugin's specific option
     * @param string $option_name
     */
    public static function delete_option($option_name){
        return delete_option('wp_multisite_cron_'.$option_name);
    }


    /**
     * 
     * get the plugin's path url
     */
    public static function get_plugin_url(){
        return get_bloginfo('url') . '/' . PLUGINDIR . '/' . dirname(plugin_basename(__FILE__));
    }
}

cron_call 함수에서 200번 행을 중심으로 다음 블록이 있습니다.

//Add the url to the stack
$chs[$blog_id]=curl_init();
curl_setopt($chs[$blog_id], CURLOPT_URL, $cron_url);
curl_setopt($chs[$blog_id], CURLOPT_HEADER, 0);
curl_multi_add_handle($mh, $ch);

그러면 먼저 컬 핸들러를 초기화합니다.$chs배열. 그런 다음, 그 값들을 사용하는 대신에, 당신은 다음을 추가하려고 합니다.$ch당신의 멀티 핸들러에 변수가 있습니다. 아마 null일 것입니다.

적절한 오류 보고 설정 및 결과 확인을 통해curl_multi_add_handle, 핸들 추가 작업이 실패한 것을 확인할 수 있을 것입니다.

php 설명서에서:

int curl_multi_add_handle ( resource $mh , resource $ch )

반환 값

성공 시 0을 반환하거나 CULM_XXX 오류 코드 중 하나를 반환합니다.

편집: 제가 해결책에 대해 충분히 설명하지 못했을 수도 있지만, 대신해야 합니다.

curl_multi_add_handle($mh, $ch);

와 함께

curl_multi_add_handle($mh, $chs[$blog_id]);

언급URL : https://stackoverflow.com/questions/11815851/php-script-not-working-to-replace-wordpress-cron-for-multi-site

반응형