2012-08-05 7 views
7

Sto cercando di sostituire cron di WordPress con il cron del server per il mio multi-sito. Sembra che devo aggiungere una voce di cron per ogni sito che potrebbe essere un incubo di gestione. Invece, voglio eseguire un singolo lavoro cron che chiama il cron per ogni sito secondario. Di seguito è riportato uno script del plug-in, ma viene visualizzato l'errore 500. Il messaggio di errore è fuorviante e errato perché indica qualcosa sul file ffmpeg non installato (nessun altro messaggio di errore). Qualcuno può aiutarmi a correggermi? Il plugin è in GitHub (https://github.com/chibani/wp_multisite_cron), ma penso che sarebbe un ottimo plugin per la comunità. Grazie per qualsiasi aiuto!Lo script PHP non funziona per sostituire WordPress cron per multi-sito

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

Se il messaggio di errore dice qualcosa su ffmpeg non essere installato, e il tuo script non ha nulla a che fare con ffmpeg, probabilmente stai guardando il messaggio di errore sbagliato. –

+0

Ho appena notato che c'era una "r" in più in arrray_slice. Quando l'ho rimosso, l'errore è andato via. L'URL sembra non essere in esecuzione però. Finora l'ho ristretto alla funzione "cron_call". Qualsiasi aiuto sarebbe molto apprezzato! – TruMan1

+0

Penso che dovrai eseguire il debug. Usa 'curl_error()' per ottenere il motivo esatto per cui le chiamate non vengono eseguite http://php.net/curl_error ... il tuo errore è segnalato? –

risposta

1

Entro la funzione cron_call, intorno alla linea 200, si dispone di questo blocco:

//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); 

Quindi, prima di inizializzare la vostra arricciatura gestori nella matrice $chs. Quindi, invece di usare quei valori, provi ad aggiungere la variabileal tuo multihandler, che presumo nullo.

Con le corrette impostazioni di segnalazione degli errori e controllando il risultato di curl_multi_add_handle, è possibile che l'operazione di aggiunta dell'handle non sia riuscita.

Dal php manual:

int curl_multi_add_handle (resource $mh , resource $ch) 

Valori restituiti

restituisce 0 in caso di successo, o di uno dei codici errori CURLM_XXX.

EDIT: forse non ero abbastanza chiaro sulla soluzione, ma è necessario sostituire

curl_multi_add_handle($mh, $ch); 

con

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