¿Cómo ejecutar una función cada 5 minutos?

15

Tengo una función que se ejecuta cada 5 minutos. Me he referido a continuación del códice:

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

Quiero ejecutar esta función solo cada 5 minutos, independientemente de cuándo comenzar. ¿Cómo puedo esto?

También dice que el codex dice que cron se ejecutará cuando un visitante visite el sitio. ¿Hay alguna forma de ejecutar el cron solo por minutos y sin esperar una visita?

digamos que la siguiente función debe ejecutarse cada 5 minutos, entonces, ¿cómo puedo hacer eso usando wp_schedule_event()o wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Codificador tonto
fuente
Será mejor mirada en por ejemplo, servicios de cron o tercera parte cron Linux si necesita un intervalo tan corto y precisión,
birgire
havs sitio de tráfico pesado .. así que no hay necesidad de tener en cuenta el intervalo de tiempo .. seguro de que van a ser desencadenados por cada 2 ó 3 minutos .. clientes prefieren hacerlo desdefunctions.php
Foolish Coder
no es posible activar un archivo php sin que algo se ejecute en el servidor con un temporizador.
Andrew Welch
¿archivo? estamos hablando de una función en functions.php
Foolish Coder
¿Crees que un servicio de monitoreo gratuito podría ser el ping que desencadena CRON? newrelic.com/server-monitoring
jgraup

Respuestas:

28

Puede crear nuevos horarios a través de 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');

Ahora puedes programar tu función:

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

Para programarlo solo una vez, envuélvalo en una función y verifique antes de ejecutarlo:

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

Tenga en cuenta el parámetro $ args! No especificar el parámetro $ args en wp_next_scheduled, pero tener $ args para wp_schedule_event hará que se programe un número casi infinito del mismo evento (en lugar de solo uno).

Finalmente, cree la función real que le gustaría ejecutar:

function my_schedule_hook(){
    // codes go here
}

Creo que es importante mencionar que wp-cron está verificando la programación y ejecuta los trabajos programados debido cada vez que se carga una página.

Entonces, si tiene un sitio web de bajo tráfico que solo tiene 1 visitante por hora, wp-cron solo se ejecutará cuando ese visitante navegue por su sitio (una vez por hora). Si tiene un sitio de alto tráfico con visitantes que solicitan una página cada segundo, wp-cron se activará cada segundo causando una carga adicional en el servidor.

La solución es desactivar wp-cron y activarlo a través de un trabajo cron real en el intervalo de tiempo del trabajo wp-cron programado que se repite más rápido (5 min en su caso).

Lucas Rolff explica el problema y da la solución en detalle.

Como alternativa, puede utilizar un servicio gratuito de terceros como UptimeRobot para consultar su sitio (y activar wp-cron) cada 5 minutos, si no desea desactivar wp-cron y activarlo a través de un trabajo cron real.

Johano Fierra
fuente
2

Si su sitio recibe mucho tráfico, puede intentar usarlo set_transient()para ejecutarlo (aproximadamente) cada 5 minutos, por ejemplo:

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' );
}
bonger
fuente
Bueno, eh, sí ...?!
Bonger
sí, NO está funcionando. He utilizado el siguiente código functions.phpcuando realizo una visita a la página, se actualizará una tabla de mi base de datos function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Pero la tabla DB no se actualiza después de 6 minutos incluso.
Codificador tonto
No sé por qué no está funcionando para ti, pero en realidad pensando en ello simplemente utilizando get_transient()/ set_transient()sin el material cron hace mucho más sentido, mucho más simple, se actualizará respuesta ...
Bonger
@bonger ¿es esta buena alternativa para wp_schedule_event ()?
Marko Kunic
@ MarkoKunić No sé para ser honesto, no lo he probado ... ¡solo se ofreció como una solución alternativa, pero si lo prueba, háganos saber ...! (La respuesta de Johano Fierra se ve bien wordpress.stackexchange.com/a/216121/57034 )
bonger
2

Puede activarlo en la activación del complemento en lugar de en cada llamada del complemento:

//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.");
}
Régis Ramillien
fuente
1

Me temo que, aparte de esperar a que alguien visite su sitio que ejecuta una función, la única otra opción es configurar un trabajo cron en su servidor usando algo como esto /programming/878600/how -to-create-cronjob-using-bash o si tiene una interfaz de estilo cpanel en su servidor, a veces hay una interfaz gráfica de usuario para configurar esto.

Andrew Welch
fuente
sí, entiendo que ... ya tengo algunos crons creados desde cPnael ... pero ahora estoy tratando de ejecutar una función functions.phpporque cuando la función está en plugino functions.phpno podemos pedir a los clientes que configuren un cron desde cpanel por su cuenta ..
Foolish Coder
1

El complemento Cronjob Scheduler le permite ejecutar tareas frecuentes de manera confiable y oportuna sin que nadie tenga que visitar su sitio, todo lo que necesita es al menos 1 acción y un horario de Unix Crontab.

Es muy fácil de usar y muy flexible. Usted crea su propia función y define una acción dentro de ella. Luego, puede elegir su acción en el menú de complementos y activarla cuando lo desee.

Marco
fuente
0

Tengo una posible solución usando una función de programación y una función recursiva WP Ajax.

  1. Cree un evento programado de 60 minutos para ejecutar una función
  2. Esta función activará una función recursiva usando Ajax a través de file_get_contents()
  3. La función ajax tendrá un contador en la base de datos con un número total de 60 (por cada minuto dentro de la hora).
  4. Esta función ajax verificará su contador para:

Si el contador es igual o superior a 60, reiniciará el contador y esperará el próximo trabajo cron.

Si el contador es múltiplo de 5 (entonces cada 5 minutos) ejecutará la función deseada

Y, además de las condiciones, dormirá durante 59 segundos sleep(59);(suponiendo que su función sea rápida). Después del sueño, se activará file_get_contents()nuevamente.

Cosas importantes a tener en cuenta:

  1. Cree una forma de interrumpir el proceso (es decir, verificar un valor en la base de datos)
  2. Cree una forma de evitar 2 procesos al mismo tiempo
  3. En file_get_contents, establezca el límite de tiempo en el encabezado en 2 o 3 segundos, de lo contrario, el servidor puede tener varios procesos esperando nada
  4. Es posible que desee utilizar el set_time_limit(90);para intentar evitar que el servidor rompa su función antes de dormir

Es una solución, no es buena, y el servidor puede bloquearla. Usando un cron externo, puede configurar una función simple y el servidor usará recursos en él una vez cada 5 minutos. Con esta solución, el servidor utilizará recursos en él todo el tiempo.

Bruno Cantuaria
fuente
0

La respuesta de @ johano explica correctamente cómo configurar un intervalo personalizado para el trabajo cronológico de WP. Sin embargo, la segunda pregunta no se responde, que es cómo ejecutar un cron cada minuto:

  1. En el archivo wp-config.php, agregue el siguiente código:

    define('DISABLE_WP_CRON', true);
  2. Agregue un trabajo cron ( crontab -een unix / linux):

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

La primera parte (paso 1) deshabilitará el trabajo cron interno de WordPress. La segunda parte (paso 2) ejecutará manualmente el trabajo cron de WordPress cada minuto.

Con la respuesta de @ Johano (cómo ejecutar una tarea cada 5 minutos) y la mía (cómo ejecutar manualmente el cron), debería poder lograr su objetivo.

Miguel
fuente