it-swarm.com.de

eine Cron-Task ausführen, ohne das Laden der Seite zu behindern?

Ich habe ein Plugin, mit dem Benutzer Post-Anhänge über AJAX im Admin-Bereich hochladen können. Ich versuche später, diese Dateien über ihre REST API an DropBox zu senden. Es fast funktioniert. Das Problem liegt in der WP Cron-Task, die beim Ausführen das Laden der Seiteverhindert, bis die Push-to-Drop-Box beendet ist(was bei größeren Dateien bis zu 30 Minuten dauern kann) .

Ich habe ähnliche Fragen angeschaut ( hier und hier ), aber letztere implizieren, dass diese Cron-Tasks tatsächlich verhindern, dass die Seite ordnungsgemäß geladen wird, während der Task ausgeführt wird.

Ist es möglich, es so einzurichten, dass das Laden von Seiten von der Ausführung von Cron-Tasks nicht beeinflusst wird? Vielleicht mache ich es nicht richtig.

Hier sind die relevanten Teile meines Plugins:

function __construct() {

    add_action( 'wp_ajax_my_admin_upload_attachment', array( $this, 'my_admin_upload_attachment') );
    add_action('my_Push_to_dropbox', array($this,'Push_to_dropbox'));

} // end constructor

function my_admin_upload_attachment() {
    /* upload and save file locally, update post meta */
    /* schedule the files to be uploaded to DropBox */
    wp_schedule_single_event(time()+5, 'my_Push_to_dropbox');
    /* return success JSON */
}

function Push_to_dropbox() {
    $this->log('Push_to_dropbox - started.');
    //$this->do_Push_to_dropbox();
    @ignore_user_abort(true); // this does not help: 'finished' message still never prints
    set_time_limit(0);
    sleep(30); // this mimicks the long-running upload task
    $this->log('Push_to_dropbox - finished.');
}

EDIT:hat define('ALTERNATE_WP_CRON', true); aus wp-config.php entfernt, jetzt werden die Seiten ohne Verzögerung geladen, aber die Cron-Aufgabe wird durch sukzessive Seitenaktualisierungen unterbrochen: Die oben genannte Meldung 'beendet' wird nicht gedruckt im Protokoll.

4
montrealist

Cron-Tasks wirken sich nicht direkt auf das Laden der Seite aus, außer auf das Timeout von 0,01 Sekunden (sie wirken sich natürlich auch auf die Serverauslastung aus, sodass sie sich auch auf das Laden der Seite auswirken könnenindirekt).

Ich vermute, dass Ihre PHP -Konfiguration das Problem ist. Die Cron-Tasks werden wie jede andere Webanforderung ausgeführt und unterliegen der Einstellung max_execution_time INI von PHP. Wenn dies beispielsweise auf 90 Sekunden eingestellt ist, stirbt die Anforderung und Ihre Dateien werden nicht synchronisiert. Sie können dies testen, indem Sie sleep auf einen niedrigeren Wert als Ihren max_execution_time setzen und prüfen, ob der Vorgang abgeschlossen ist.

In diesem Fall können Sie Folgendes hinzufügen:

ini_set( 'max_execution_time', 0 );

an die Spitze Ihrer Push_to_dropbox() Funktion. Es ist keine großartige Lösung, da es nicht auf jedem Host funktioniert, aber es ist ein Anfang.

2
Matthew Boynes

Laut WP Plugin Handbook "Alle geplanten Aufgaben werden während des Ladens dieser Seite ausgeführt." Daher verlangsamt es immer das Laden der Seite und sollte nicht verwendet werden, um ein tatsächliches CRON (oder eine geplante Aufgabe) für große Aufgaben, auf die der Benutzer nicht warten muss, direkt zu ersetzen.

Eine bessere Lösung besteht darin, eine WP Cron-Task einzurichten, um eine asynchrone Task auszulösen, die die Arbeit im Hintergrund erledigt - am einfachsten mit einer Bibliothek wie dieser . Auf diese Weise muss der Benutzer nicht warten, bis der Prozess abgeschlossen ist, und der Prozess wird nicht beendet, wenn der Benutzer die Verbindung trennt.

Alternativ könnte man einen Dienst wie AWS Lambda oder CronJob.org verwenden, um den Prozess zu starten.

1
Justin Waulters