Tengo alrededor de 20 wp_cron()
funciones como el siguiente código. Casi todos los crons se ejecutan cada hora; Algunos son diarios.
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 el rendimiento del servidor y para no seguir recibiendo mensajes de límite de servidor de las empresas de alojamiento, quiero asegurarme de que solo se ejecute un cron en un momento dado ... ¿Es posible?
La respuesta actual aceptada es excelente, pero tengo la siguiente pregunta, es por eso que comienzo una recompensa por esta pregunta.
Por favor, lea la respuesta aceptada al principio.
Supongamos que Cron 1 se ejecuta, mi código de cron2 no se ejecutará porque todavía estamos dentro de los 5 minutos o el primer cron se está ejecutando, pero debido a que se wp_schedule_event( time(), 'hourly', 'my_task_hook' );
ejecuta para cron2, creo que WordPress considera que cron2 se ejecuta ... Así que básicamente el código del código cron2 nunca se ejecuta ..... ¿O he entendido mal algo?
Respuestas:
Sí, es posible...
Y para ser sincero, a menudo es muy importante hacer esto ... WP Scheduler a veces tiende a causar problemas, cuando las tareas cron son largas ...
Entonces, ¿cómo resuelvo este problema?
Utilizo la API de transitorios para implementar semáforos ...
Aquí está el código:
¿Por qué uso transitorios en este caso? Porque:
¿Y qué pasa si hay muchas acciones diferentes que hacer?
Entonces, digamos que hay muchas tareas cron diferentes, que nunca deberían ejecutarse al mismo tiempo, pero todavía queremos que todas se ejecuten ...
Si usamos la solución con semáforo y usamos solo un semáforo para todas estas tareas, entonces algunas de ellas nunca se ejecutarán. Entonces, ¿qué hacer entonces?
En tal caso, debe cambiar su forma de pensar. No tiene algunas tareas independientes, sino una cola de tareas que hacer. Por lo tanto, debe implementarlo de esta manera.
Entonces:
fuente
delete_transient()
? ¿Entonces ese tiempo importa? Quiero decir, cada vez que lo ponesset_transient
, se elimina justo después de que mi trabajo está hecho ... Entonces, ¿por qué hay un momento?my_task_function_semaphore
como nombre para transitorios, ¿debo usar todos los demás cron con el mismo nombre?