4 Stimmen

Verzichten Sie auf lange Prozesse in PHP (aber lassen Sie sie abschließen)

Ich habe ein HTML-Formular, das an eine PHP-Seite weitergeleitet wird, die ein Skript initiiert. Die Ausführung des Skripts kann zwischen 3 und 30 Sekunden dauern - der Benutzer muss nicht anwesend sein, um das Skript zu beenden.

Ist es möglich, ein PHP-Skript zu starten, sofort ein "Danke" an den Benutzer (oder was auch immer) zu drucken und ihn seinen Weg gehen zu lassen, während Ihr Skript weiterarbeitet?

In meinem speziellen Fall sende ich Formulardaten an ein PHP-Skript, das die Daten dann an zahlreiche andere Stellen weiterleitet. Das Warten auf die erfolgreiche Übermittlung aller Daten ist im Moment nicht in meinem Interesse. Ich möchte einfach nur das Skript laufen lassen, damit der Benutzer gehen und tun kann, was er will, und das war's.

2voto

Daniel Von Fange Punkte 5823

Legen Sie Ihre langfristige Arbeit in ein anderes php-Skript, zum Beispiel

Hintergrund.php:

sleep(10);
file_put_contents('foo.txt',mktime());

foreground.php

$unused_but_required = array();
proc_close(proc_open ("php background.php &", array(), $unused_but_required));
echo("Done);

Sie sehen sofort "Done", und die Datei wird 10 Sekunden später geschrieben.

Ich denke, proc_close funktioniert, weil wir proc_open keine Pipes und keine Dateideskriptoren gegeben haben.

1voto

Pim Jager Punkte 31389

In dem Skript können Sie einstellen:

<?php
 ignore_user_abort(true);

Auf diese Weise wird das Skript nicht abgebrochen, wenn der Benutzer die Seite verlässt. Seien Sie jedoch sehr vorsichtig, wenn Sie dies mit

 set_time_limit(0);

Seitdem könnte das Skript ewig laufen.

1voto

troelskn Punkte 110542

Sie können verwenden set_time_limit y ignore_user_abort Aber im Allgemeinen würde ich empfehlen, den Auftrag in eine Warteschlange zu stellen und ihn mit einem asynchronen Skript zu verarbeiten. Das ist ein viel einfacheres und haltbareres Design.

0voto

clawr Punkte 7757

Sie könnten versuchen, die flush und die zugehörigen Ausgabepufferfunktionen, um den Inhalt des Puffers sofort an den Browser zu senden:

0voto

John Ellinwood Punkte 13961

Es gibt einen API-Wrapper um pcntl_fork() namens php_fork .

Aber auch diese Frage war auf der Tägliches WTF ... schlage keinen Nagel mit einer Glasflasche ein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X