Eu tenho cerca de 20 wp_cron()
funções como o código a seguir. Quase todos os crons funcionam a cada hora; alguns são diários.
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
//Complex Code
}
Para aumentar o desempenho do servidor e não continuar recebendo mensagens de limite de servidor das empresas de hospedagem, quero garantir que apenas um cron seja executado em um determinado momento ... É possível?
A resposta atual aceita é ótima, mas tenho a seguinte pergunta, é por isso que começo uma recompensa por essa pergunta.
Por favor, leia a resposta aceita primeiro.
Vamos supor que o Cron 1 seja executado, meu código do cron2 não funcionará porque ainda estamos dentro dos 5 minutos ou o primeiro cron ainda está em execução, mas por causa da wp_schedule_event( time(), 'hourly', 'my_task_hook' );
execução do cron2, acho que o WordPress considera o cron2 executado ..... Então, basicamente, codifica do código cron2 nunca roda ..... Ou entendi algo errado?
Respostas:
Sim, é possível...
E para ser sincero, geralmente é muito importante fazer isso ... O WP Scheduler às vezes tende a causar problemas, quando as tarefas cron são longas ...
Então, como eu resolvo esse problema?
Eu uso a API de transientes para implementar semáforos ...
Aqui está o código:
Por que eu uso transitórios neste caso? Porque:
E se houver muitas ações diferentes para fazer?
Então, digamos que existem muitas tarefas cron diferentes, que nunca devem ser executadas ao mesmo tempo, mas ainda queremos que todas sejam executadas ...
Se usarmos a solução com semáforo e usar apenas um semáforo para todas essas tarefas, algumas delas poderão nunca ser executadas. Então o que fazer então?
Nesse caso, você deve mudar seu pensamento. Você não tem algumas tarefas independentes, mas uma fila de tarefas a serem executadas. Portanto, você deve implementá-lo dessa maneira.
Assim:
fonte
delete_transient()
. Então esse tempo importa? Quero dizer, sempre que você dedicaset_transient
, é excluído logo após o final do meu trabalho ... Então, por que há um tempo?my_task_function_semaphore
como o nome de transitório, devo usar todos os outros crons com o mesmo nome?