Ich habe ungefähr 20 wp_cron()
Funktionen wie den folgenden Code. Fast alle Cron laufen stündlich; einige sind täglich.
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
}
Um die Serverleistung zu erhöhen und keine Server-Limit-Nachrichten von Hosting-Unternehmen zu erhalten, möchte ich sicherstellen, dass jeweils nur ein Cron ausgeführt wird ... Ist dies möglich?
Die derzeit akzeptierte Antwort ist großartig, aber ich habe folgende Frage, deshalb starte ich ein Kopfgeld für diese Frage.
Bitte lesen Sie zuerst die akzeptierte Antwort.
Nehmen wir an, Cron 1 wird ausgeführt. Mein Code von cron2 wird nicht ausgeführt, da wir uns noch innerhalb der 5 Minuten befinden oder der erste Cron noch ausgeführt wird. Aufgrund der wp_schedule_event( time(), 'hourly', 'my_task_hook' );
Ausführung von cron2 denke ich, dass WordPress als cron2 ausgeführt wird. Also im Grunde genommen Code von cron2 Code nie ausgeführt ..... Oder ich habe etwas falsch verstanden?
Antworten:
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:
Warum verwende ich in diesem Fall Transienten? Weil:
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:
quelle
delete_transient()
. Also ist diese Zeit wichtig? Ich meine, wann immer Sieset_transient
es tun, es wird gelöscht, sobald meine Arbeit erledigt ist ... Warum gibt es also eine Zeit?my_task_function_semaphore
muss ich, wenn ich als Namen für transient verwende, alle anderen Cron mit demselben Namen verwenden?