web-dev-qa-db-fra.com

Comment exécuter une fonction toutes les 5 minutes?

J'ai une fonction à exécuter toutes les 5 minutes. Je me suis référé à la suite du codex:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

Je veux exécuter cette fonction tous les 5 minutes, quel que soit le moment pour commencer. Comment puis-je cela?

En outre, il est indiqué que codex indique que cron sera exécuté lorsqu'un visiteur visite le site. Existe-t-il un moyen d'exécuter le cron selon le nombre de minutes et d'attendre une visite?

disons que la fonction suivante doit être exécutée toutes les 5 minutes, puis comment puis-je le faire en utilisant wp_schedule_event() ou wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
10
Foolish Coder

Vous pouvez créer de nouveaux horaires via cron_schedules:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

Maintenant, vous pouvez planifier votre fonction:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

Pour ne le planifier qu'une seule fois, enveloppez-le dans une fonction et vérifiez avant de l'exécuter:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

Notez le paramètre $ args! Ne pas spécifier le paramètre $ args dans wp_next_scheduled, mais avoir $ args pour wp_schedule_event entraînera la planification d'un nombre presque infini du même événement (au lieu d'un seul).

Enfin, créez la fonction que vous souhaitez exécuter:

function my_schedule_hook(){
    // codes go here
}

Je pense qu'il est important de mentionner que wp-cron vérifie la planification et exécute les tâches planifiées chaque fois qu'une page est chargée.

Ainsi, si vous avez un site Web à faible trafic qui ne compte qu'un visiteur par heure, wp-cron ne s'exécutera que lorsque ce visiteur aura accédé à votre site (une fois par heure). Si votre site est très fréquenté et que les visiteurs demandent une page toutes les secondes, wp-cron se déclenchera toutes les secondes et entraînera une charge supplémentaire sur le serveur.

La solution consiste à désactiver wp-cron et à le déclencher via un vrai travail cron dans l'intervalle de temps où vous répétez le plus rapidement le travail planifié wp-cron (5 min dans votre cas).

Lucas Rolff explique le problème et donne la solution en détail.

Vous pouvez également utiliser un service tiers gratuit tel que UptimeRobot pour interroger votre site (et déclencher wp-cron) toutes les 5 minutes, si vous ne souhaitez pas désactiver wp-cron et le déclencher via un véritable cron. emploi.

23
Johano Fierra

Si votre site reçoit un trafic important, vous pouvez utiliser set_transient() pour l'exécuter (très approximativement) toutes les 5 minutes, par exemple:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}
2
bonger

Vous pouvez le déclencher lors de l'activation d'un plugin au lieu de chaque appel du plugin:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}
2
Régis Ramillien

Je crains qu'autrement que d'attendre que quelqu'un visite votre site qui exécute une fonction, la seule autre option consiste à configurer un travail cron sur votre serveur en utilisant quelque chose comme ceci https://stackoverflow.com/questions/878600/how-to-create-cronjob-using-bash ou si vous avez une interface de style cpanel sur votre serveur, il existe parfois une interface graphique pour la configurer.

1
Andrew Welch

Le plugin Cronjob Scheduler vous permet d'exécuter des tâches fréquentes de manière fiable et rapide sans que quiconque ait à visiter votre site. Il vous suffit au moins une action et un programme Unix Crontab.

C'est très facile à utiliser et très flexible. Vous créez votre propre fonction et définissez une action en son sein. Ensuite, vous pouvez choisir votre action dans le menu du plugin et la lancer à tout moment.

1
Marco

La réponse de @ johano explique correctement comment configurer un intervalle personnalisé pour le travail WP. La deuxième question n’a pas de réponse: comment faire fonctionner un cron toutes les minutes:

  1. Dans le fichier wp-config.php, ajoutez le code suivant:

    define('DISABLE_WP_CRON', true);
    
  2. Ajouter un travail cron (crontab -e sur unix/linux):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron
    

La première partie (étape 1) désactivera le travail interne de WordPress. La deuxième partie (étape 2) lancera manuellement le travail cron de WordPress toutes les minutes.

Avec la réponse de @ Johano (comment exécuter une tâche toutes les 5 minutes) et la mienne (comment exécuter manuellement le cron), vous devriez pouvoir atteindre votre objectif.

0
Mike

J'ai une solution possible en utilisant une fonction de planification et une fonction récursive WP Ajax.

  1. Créer un événement de planification de 60 minutes pour exécuter une fonction
  2. Cette fonction déclenchera une fonction récursive en utilisant Ajax via file_get_contents()
  3. La fonction ajax aura un compteur sur la base de données avec un nombre total de 60 (pour chaque minute dans l'heure).
  4. Cette fonction ajax va vérifier votre compteur à:

Si le compteur est supérieur ou égal à 60, il réinitialisera le compteur et attendra le prochain travail périodique.

Si le compteur est multiple de 5 (donc toutes les 5 minutes), il exécutera la fonction souhaitée

Et, outre les conditions, il dormira pendant 59 secondes sleep(59); (en supposant que votre fonction soit rapide). Après le sommeil, il se déclenchera à l'aide de file_get_contents()again.

Points importants à noter:

  1. Créer un moyen d'interrompre le processus (c'est-à-dire vérifier une valeur sur la base de données)
  2. Créer un moyen d'éviter 2 processus en même temps
  3. Sur file_get_contents, définissez la limite de temps sur l'en-tête sur 2 ou 3 secondes, sinon le serveur peut avoir plusieurs processus en attente de rien
  4. Vous voudrez peut-être utiliser la set_time_limit(90); pour essayer d'empêcher le serveur de casser votre fonction avant la mise en veille.

C'est une solution, pas une bonne, et elle peut être bloquée par le serveur. En utilisant un cron externe, vous pouvez définir une fonction simple et le serveur utilisera les ressources une fois toutes les 5 minutes. En utilisant cette solution, le serveur utilisera des ressources à tout moment.

0
Bruno Cantuaria