Como executar uma função a cada 5 minutos?

14

Eu tenho uma função para ser executada a cada 5 minutos. Mencionei o seguinte no codex:

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

Quero executar esta função apenas a cada 5 minutos, independentemente de quando iniciar. Como posso isso?

Também diz que o codex diz que o cron será executado quando um visitante visitar o site. Existe alguma maneira de executar o cron apenas por minutos e sem esperar uma visita?

digamos que a função a seguir deve ser executada a cada 5 minutos, então como posso fazer isso usando wp_schedule_event()or wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Codificador tolo
fonte
É melhor olhar para exemplo cron ou 3º cron partido serviços Linux, se você precisa de um curto intervalo e precisão,
birgire
havs local de tráfego pesado .. assim não há necessidade de considerar o intervalo de tempo .. certeza que vai ser acionado para cada 2 ou 3 minutos .. clientes preferem fazê-lo defunctions.php
Foolish Coder
não é possível disparar um arquivo php sem algo rodando no servidor com um timer.
Andrew Welch
Arquivo? estamos a falar de uma função em functions.php
Foolish Coder
Você acha que um serviço de monitoramento gratuito pode ser o ping que aciona o CRON? newrelic.com/server-monitoring
jgraup

Respostas:

27

Você pode criar novos horários de agendamento 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');

Agora você pode agendar sua função:

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

Para agendá-lo apenas uma vez, envolva-o em uma função e verifique antes de executá-lo:

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

Observe o parâmetro $ args! Não especificar o parâmetro $ args em wp_next_scheduled, mas ter $ args para wp_schedule_event, fará com que um número quase infinito do mesmo evento seja agendado (em vez de apenas um).

Por fim, crie a função real que você deseja executar:

function my_schedule_hook(){
    // codes go here
}

Eu acho importante mencionar que o wp-cron está verificando o agendamento e executando os trabalhos agendados devidos toda vez que uma página é carregada.

Portanto, se você tiver um site de baixo tráfego que tenha apenas 1 visitante por hora, o wp-cron será executado apenas quando esse visitante navegar no seu site (uma vez por hora). Se você possui um site de alto tráfego com visitantes solicitando uma página a cada segundo, o wp-cron será acionado a cada segundo, causando carga extra no servidor.

A solução é desativar o wp-cron e acioná-lo por meio de um trabalho cron real no intervalo de tempo em que você executou o trabalho wp-cron de repetição mais rápida (5 min no seu caso).

Lucas Rolff explica o problema e fornece a solução em detalhes.

Como alternativa, você pode usar um serviço gratuito de terceiros, como o UptimeRobot, para consultar seu site (e acionar o wp-cron) a cada 5 minutos, se você não deseja desativar o wp-cron e ativá-lo por meio de um trabalho cron real.

Johano Fierra
fonte
2

Se o seu site recebe tráfego intenso, você pode tentar set_transient()executá-lo (aproximadamente) a cada 5 minutos, por exemplo:

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
fonte
Bem, er, sim ...?!
Bonger
Sim., NÃO está funcionando .. Eu usei o código a seguir functions.phpquando uma visita é feita na página, uma atualização será feita em uma tabela no meu banco de dados function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Mas a tabela do banco de dados não é atualizada após 6 minutos mesmo.
Foolish Coder
Não sei por que ele não está funcionando para você, mas realmente pensando sobre isso apenas usando get_transient()/ set_transient()sem o material cron faz muito mais sentido, muito mais simples, vai atualizar resposta ...
Bonger
@bonger é esta boa alternativa para wp_schedule_event ()?
Marko Kunic
@ MarkoKunić Não sei para ser honesto, não tentei ... foi oferecido apenas como uma solução alternativa, mas se você tentar, avise-nos ...! (A resposta de Johano Fierra parece bom wordpress.stackexchange.com/a/216121/57034 )
Bonger
2

Você pode acioná-lo na ativação do plug-in em vez de em cada chamada do 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.");
}
Régis Ramillien
fonte
1

Receio que, além de esperar alguém visitar seu site que executa uma função, a única outra opção é configurar um trabalho cron no seu servidor usando algo como este /programming/878600/how -to-create-cronjob-using-bash ou se você possui uma interface de estilo cpanel no seu servidor, às vezes há uma interface gráfica para configurar isso.

Andrew Welch
fonte
sim,., eu entendo isso .. eu já tenho alguns crons criados a partir do cPnael .. mas agora estou tentando executar uma função functions.phpporque, quando a função está em um pluginou em functions.php, não podemos pedir aos clientes que configurem um cron a partir do cpanel por conta própria ..
Foolish Coder
1

O plug- in Cronjob Scheduler permite que você execute tarefas frequentes de maneira confiável e oportuna, sem que ninguém precise visitar seu site, tudo o que você precisa é de pelo menos 1 ação e um cronograma Unix Crontab.

É muito fácil de usar e muito flexível. Você cria sua própria função e define uma ação dentro dela. Depois, você pode escolher sua ação no menu do plug-in e acioná-la sempre que quiser.

Marco
fonte
0

Eu tenho uma solução possível usando uma função de agendamento e uma função WP Ajax recursiva.

  1. Crie um evento de agendamento de 60 minutos para executar uma função
  2. Essa função acionará uma função recursiva usando o Ajax através de file_get_contents()
  3. A função ajax terá um contador no banco de dados com um número total de 60 (para cada minuto dentro de uma hora).
  4. Esta função ajax verificará seu contador para:

Se o contador for igual ou superior a 60, ele redefinirá o contador e aguardará o próximo trabalho cron.

Se o contador for múltiplo de 5 (a cada 5 minutos), ele executará a função desejada

E, além das condições, ele dorme por 59 segundos sleep(59);(assumindo que sua função seja rápida). Após o sono, ele será ativado file_get_contents()novamente.

Coisas importantes a serem observadas:

  1. Crie uma maneira de interromper o processo (ou seja, verificando um valor no banco de dados)
  2. Crie uma maneira de impedir 2 processos ao mesmo tempo
  3. Em file_get_contents, defina o limite de tempo no cabeçalho para 2 ou 3 segundos, caso contrário, o servidor poderá ter vários processos esperando por nada
  4. Você pode usar o set_time_limit(90);para tentar impedir que o servidor interrompa sua função antes do sono

É uma solução, não é boa, e pode ser bloqueada pelo servidor. Usando um cron externo, você pode definir uma função simples e o servidor utilizará recursos uma vez a cada 5 minutos. Usando esta solução, o servidor utilizará recursos o tempo todo.

Bruno Cantuaria
fonte
0

A resposta de @ johano explica corretamente como configurar um intervalo personalizado para o trabalho cron do WP. A segunda pergunta ainda não foi respondida, que é como executar um cron a cada minuto:

  1. No arquivo wp-config.php, adicione o seguinte código:

    define('DISABLE_WP_CRON', true);
  2. Adicione um trabalho cron ( crontab -eno unix / linux):

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

A primeira parte (etapa 1) desabilitará o trabalho cron interno do WordPress. A segunda parte (etapa 2) executará manualmente o cron do WordPress a cada minuto.

Com a resposta de @ Johano (como executar uma tarefa a cada 5 minutos) e a minha (como executar manualmente o cron), você deve conseguir atingir seu objetivo.

Mike
fonte