2012-08-05 12 views
7

WordPress cronを私のマルチサイトのサーバーcronに置き換えようとしています。管理上の悪夢となる可能性がある各サイトのcronエントリを追加する必要があるようです。代わりに、私は各サブサイトのcronを呼び出す単一のcronジョブを実行したい。以下はプラグインスクリプトですが、エラー500が表示されます。ffmpegがインストールされていないことを示すため、エラーメッセージは誤解を招き、誤っています(他のエラーメッセージはありません)。誰かが私にこれを正すのを助けてくれますか?プラグインはGitHub(https://github.com/chibani/wp_multisite_cron)にありますが、私はコミュニティのための素晴らしいプラグインを作ってくれると思います。助けてくれてありがとう!だから、最初にあなたが$chs配列にあなたのカール・ハンドラを初期化PHPスクリプトがWordPress 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); 

:あなたのcron_call関数内で

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__)); 
    } 
} 
+0

を交換する必要がある、とあなたのスクリプトはffmpegとは関係がありません。間違ったエラーメッセージが表示される可能性があります。 –

+0

arrray_sliceに余分な "r"があることに気がつきました。私が取り外すと、エラーは消え去った。 URLは実行されていないようです。私はこれまで関数 "cron_call"に絞っています。どんな助けでも大歓迎です! – TruMan1

+0

私はあなたがそれをデバッグする必要があると思います。 'curl_error()'を使用すると、呼び出しが実行されない理由を正確に知ることができます。http://php.net/curl_error ...エラー報告は有効ですか? –

答えて

1

は、ライン200の周りに、あなたはこのブロックを持っています。次に、これらの値を使用する代わりに、$ch変数をマルチハンドラに追加しようとします。これはヌルです。

適切なエラー報告の設定とcurl_multi_add_handleの結果を確認すると、ハンドルの追加操作が失敗したことがわかります。 php manualから

int curl_multi_add_handle (resource $mh , resource $ch) 

戻る

成功時には0を返し、またはCURLM_XXXエラーコードのいずれかの値。

EDIT:多分私は解決策に十分明確ではありませんでしたが、あなたは、エラー・メッセージがインストールされていないのffmpegについて何か言う場合

curl_multi_add_handle($mh, $ch); 

curl_multi_add_handle($mh, $chs[$blog_id]); 
関連する問題