Ja, es ist möglich...
Und um ehrlich zu sein, ist es oft sehr wichtig, dies zu tun ... WP Scheduler verursacht manchmal Probleme, wenn Cron-Aufgaben lang sind ...
Wie löse ich dieses Problem?
Ich benutze die Transienten-API , um Semaphoren zu implementieren ...
Hier ist der Code:
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() {
// if some other my_task is already running, stop
if ( get_transient( 'my_task_function_semaphore' ) ) return;
// set semaphore for 5 minutes
set_transient( 'my_task_function_semaphore', true, 5*60 );
// DO YOUR STUFF
delete_transient( 'my_task_function_semaphore' );
}
Warum verwende ich in diesem Fall Transienten? Weil:
- Sie sind Teil von WP.
- Sie sind einfach zu bedienen und effizient.
- Sie werden keine Deadlocks verursachen. Angenommen, meine Cron-Aufgabe kann getötet werden (es kann ein Fehler auftreten oder sie läuft zu lange und wird getötet usw.). In diesem Fall wird das Semaphor nicht gelöscht, sodass alle zukünftigen Aufgaben nicht funktionieren. Die Verwendung von Transienten löst dieses Problem, da Transienten nach einiger Zeit gelöscht werden.
Und was ist, wenn es viele verschiedene Aktionen gibt?
Nehmen wir also an, es gibt viele verschiedene Cron-Aufgaben, die niemals zur gleichen Zeit ausgeführt werden sollten, aber wir möchten, dass sie alle ausgeführt werden ...
Wenn wir die Lösung mit Semaphor verwenden und für alle diese Aufgaben nur ein Semaphor verwenden, werden einige von ihnen möglicherweise nie ausgeführt. Was ist dann zu tun?
In diesem Fall sollten Sie Ihr Denken ändern. Sie haben keine unabhängigen Aufgaben, sondern eine Reihe von Aufgaben. Sie sollten es also auf diese Weise implementieren.
So:
- Sie fügen eine Art Warteschlange hinzu (Sie können ein Array verwenden und als Option speichern oder eine benutzerdefinierte DB-Tabelle hinzufügen).
- Sie verwenden Ihr aktuelles stündliches WP-Cron-Ereignis, um Aufgaben zur Warteschlange hinzuzufügen.
- Sie fügen zweite WP-Cron-Aufgaben hinzu, die viel häufiger ausgeführt werden und die Aufgaben einzeln aus der Warteschlange "fressen". Diese "Esser" -Aufgabe sollte ein Semaphor verwenden, um sicherzustellen, dass jeweils nur eine Aufgabe ausgeführt wird.