Come eseguire una funzione ogni 5 minuti?


15

Ho una funzione da eseguire ogni 5 minuti. Ho fatto riferimento al seguente codice:

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

Voglio eseguire questa funzione ogni 5 minuti indipendentemente da quando iniziare. Come posso questo?

Inoltre dice che il codice dice che cron verrà eseguito quando un visitatore visita il sito. C'è un modo per eseguire il cron proprio come al minuto e non in attesa di una visita?

diciamo che la seguente funzione dovrebbe essere eseguita ogni 5 minuti, quindi come posso farlo usando wp_schedule_event()o wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

È meglio esaminare, ad esempio, Linux cron o servizi cron di terze parti se hai bisogno di un intervallo e una precisione così brevi,
birgire

sito ha un traffico intenso .. quindi non c'è bisogno di considerare l'intervallo di tempo .. sicuro che verrà attivato ogni 2 o 3 minuti .. i clienti preferiscono farlo dafunctions.php
Foolish Coder

non è possibile attivare un file php senza qualcosa in esecuzione sul server con un timer.
Andrew Welch,

file? stiamo parlando di una funzione in
Functions.php

Pensi che un servizio di monitoraggio gratuito potrebbe essere il ping che attiva CRON? newrelic.com/server-monitoring
jgraup

Risposte:


28

Puoi creare nuovi orari programmati tramite 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');

Ora puoi programmare la tua funzione:

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

Per programmarlo solo una volta, avvolgilo in una funzione e controlla prima di eseguirlo:

$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');
}

Nota il parametro $ args! Non specificando il parametro $ args in wp_next_scheduled, ma avendo $ args per wp_schedule_event, verrà programmato un numero quasi infinito dello stesso evento (anziché solo uno).

Infine, crea la funzione effettiva che desideri eseguire:

function my_schedule_hook(){
    // codes go here
}

Penso che sia importante menzionare che wp-cron sta controllando la pianificazione e sta eseguendo i lavori previsti ogni volta che viene caricata una pagina.

Quindi, se hai un sito Web a basso traffico che ha solo 1 visitatore l'ora, wp-cron verrà eseguito solo quando quel visitatore naviga sul tuo sito (una volta ogni ora). Se hai un sito ad alto traffico con visitatori che richiedono una pagina ogni secondo, wp-cron verrà attivato ogni secondo causando un carico aggiuntivo sul server.

La soluzione è disattivare wp-cron e attivarlo tramite un processo cron reale nell'intervallo di tempo del processo wp-cron programmato ripetendo più rapidamente (5 minuti nel caso).

Lucas Rolff spiega il problema e fornisce la soluzione in dettaglio.

In alternativa, è possibile utilizzare un servizio di terze parti gratuito come UptimeRobot per eseguire una query sul sito (e attivare wp-cron) ogni 5 minuti, se non si desidera disattivare wp-cron e attivarlo tramite un processo cron reale.


2

Se il tuo sito riceve traffico intenso, puoi provare a utilizzarlo set_transient()(molto approssimativamente) ogni 5 minuti, ad esempio:

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' );
}

Bene, ehm, sì?! ...
bonger

Si., non è di lavoro .. Ho usato seguente codice nel functions.phpcaso di visita make alla pagina, sarà fatto per una tabella nel mio database un aggiornamento .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Ma la tabella DB non viene aggiornata nemmeno dopo 6 minuti.
Foolish Coder,

Non so perché non funziona per te, ma in realtà pensarci solo usando get_transient()/ set_transient()senza le cose cron ha molto più senso, molto più semplice, aggiornerà la risposta ...
bonger

@bonger è questa una buona alternativa a wp_schedule_event ()?
Marko Kunic,

@ MarkoKunić Non so essere sincero, non l'ho provato ... è stato offerto solo come soluzione alternativa, ma se lo provi facci sapere ...! (La risposta di Johano Fierra sembra buona wordpress.stackexchange.com/a/216121/57034 )
bonger

2

Puoi attivarlo nell'attivazione del plug-in anziché in ogni chiamata del plug-in:

//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.");
}

1

Temo che oltre ad aspettare che qualcuno visiti il ​​tuo sito che esegue una funzione, l'unica altra opzione è quella di impostare un lavoro cron sul tuo server usando qualcosa come questo /programming/878600/how -per-creare-cronjob-usando-bash o se hai un'interfaccia in stile cpanel sul tuo server, a volte c'è una GUI per l'impostazione.


sì, lo capisco .. Ho già creato alcuni croni da cPnael .. ma ora sto provando a eseguire una funzione functions.phpperché quando la funzione è in plugino functions.phpnon possiamo chiedere ai clienti di impostare un cron da cpanel da soli ..
Stupido programmatore,

1

Il plugin Cronjob Scheduler ti consente di eseguire attività frequenti in modo affidabile e tempestivo senza che nessuno debba visitare il tuo sito, tutto ciò che serve è almeno 1 azione e una pianificazione Unix Crontab.

È molto facile da usare e molto flessibile. Crei la tua funzione e definisci un'azione al suo interno. Quindi puoi scegliere la tua azione dal menu del plug-in e lanciarla quando vuoi.


0

Ho una possibile soluzione utilizzando una funzione di pianificazione e una funzione ricorsiva WP Ajax.

  1. Creare un evento di pianificazione di 60 minuti per eseguire una funzione
  2. Questa funzione attiverà una funzione ricorsiva usando Ajax attraverso file_get_contents()
  3. La funzione ajax avrà un contatore sul database con un numero totale di 60 (per ogni minuto nell'ora).
  4. Questa funzione Ajax controllerà il tuo contatore per:

Se il contatore è uguale o superiore a 60 ripristinerà il contatore e attenderà il prossimo cron job.

Se il contatore multiplo di 5 (quindi ogni 5 minuti) eseguirà la funzione desiderata

E, oltre alle condizioni, dormirà per 59 secondi sleep(59);(supponendo che la tua funzione sia rapida). Dopo il sonno, si attiverà file_get_contents()nuovamente.

Cose importanti da notare:

  1. Creare un modo per interrompere il processo (ovvero verificare un valore sul DB)
  2. Crea un modo per prevenire 2 processi contemporaneamente
  3. Su file_get_contents impostare il limite di tempo sull'intestazione su 2 o 3 secondi, altrimenti il ​​server potrebbe avere vari processi in attesa di nulla
  4. È possibile utilizzare il set_time_limit(90);per provare a impedire al server di interrompere la funzione prima di andare in sospensione

È una soluzione, non buona, e potrebbe essere bloccata dal server. Usando un cron esterno puoi impostare una semplice funzione e il server utilizzerà le risorse su di esso una volta ogni 5 minuti. Utilizzando questa soluzione, il server utilizzerà continuamente le risorse su di esso.


0

La risposta di @ johano spiega correttamente come impostare un intervallo personalizzato per il processo cron WP. Tuttavia, alla seconda domanda non viene data risposta, ovvero come eseguire un cron ogni minuto:

  1. Nel file wp-config.php, aggiungi il seguente codice:

    define('DISABLE_WP_CRON', true);
  2. Aggiungi un lavoro cron ( crontab -esu unix / linux):

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

La prima parte (passaggio 1) disabiliterà il processo cron interno di WordPress. La seconda parte (passaggio 2) eseguirà manualmente il processo cron di WordPress ogni minuto.

Con la risposta di @ Johano (come eseguire un'attività ogni 5 minuti) e la mia (come eseguire manualmente il cron), dovresti essere in grado di raggiungere il tuo obiettivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.