Heim >Backend-Entwicklung >PHP-Tutorial >Einführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code
Dieser Artikel bietet Ihnen eine Einführung in fastcgi_finish_request und seinen nicht blockierenden Code. Ich hoffe, dass er für Sie hilfreich ist.
In tatsächlichen Projekten besteht häufig eine solche Anforderung, dass vom Frontend gesendete Anfragen im Backend lange verarbeitet werden müssen, um den Benutzern jedoch zur Verfügung zu stehen Bessere Erfahrung: Um zu verhindern, dass PHP bei der Verarbeitung langfristiger Aufgaben im Backend blockiert und schnell auf Seitenanfragen reagiert, wird die Anwendung von fastcgi_finish_request hier zusammengefasst. Natürlich gibt es viele Möglichkeiten, Nichtblockierung in PHP zu implementieren, wie zum Beispiel asynchrone Skripte und Swoole, aber ich persönlich denke, dass fastcgi_finish_request die einfachste und bequemste ist.
(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request – alle Antwortdaten an den Client senden
boolean fastcgi_finish_request (void)Diese Funktion sendet alle Antwortdaten an den Client und beendet die Anfrage. Dadurch können Aufgaben, deren Ausführung lange dauert, weiter ausgeführt werden, nachdem der Client die Verbindung beendet hat.
Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück
PHP wird mit Webserver verwendet. Wenn PHP- Wenn FPM (FastCGI Process Manager) installiert ist, kann die Sitzung über die Funktion fastcgi_finish_request() sofort beendet werden und der PHP-Thread kann im Hintergrund weiterlaufen. Mit anderen Worten, diese Funktion kann nur für die Prozessverwaltungsmethode von PHP-FPM verwendet werden
Solange der Code an dieser Position ausgeführt wird, wurde die Anforderung getrennt und die Parameter zurückgegeben an den Kunden. Der folgende Code hat nichts mit dem Client zu tun. Das heißt, die Inhaltsausgabe auf der Seite muss vor der Funktion fastcgi_finish_request platziert werden
Nachdem fastcgi_finish_request() die Clientverbindung beendet hat, wird die Laufzeit weiterhin durch das Timeout max_execution_time beeinflusst Das heißt, wenn Sie damit rechnen, dass die Ausführung des Codes im Backend lange dauert, müssen Sie dennoch set_time_limit(0)
festlegen Bei hoher Parallelität führt dies auch dazu, dass der Fastcgi-Prozess nicht rechtzeitig freigegeben wird und ein 502-Fehler auftritt.
echo "program start..."; file_put_contents('/tmp/garylog.log','start-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND); fastcgi_finish_request();sleep(1); // set_time_limit(0); // sleep(150); $num = 25; $num += 1; sleep(5); echo 'debug...'; file_put_contents('/tmp/garylog.log', 'start-proceed:'.$num.',时间'.date('Y-m-d H:i:s')."\n", FILE_APPEND); sleep(10); file_put_contents('/tmp/garylog.log', 'end-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND);
Test durchführen
Kompatibel mit Nicht-PHP-FPM
Im Hinblick auf die Codeportabilität können Sie den folgenden Code an den Code anhängen:
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }
Es wird keine Code-Bereitstellungsprobleme in Nicht-FPM-Umgebungen verursachen.
Für die oben genannten Probleme: Übermäßige Ausführungszeit bei hoher Parallelität verursachen auch fastcgi Der Prozess reicht nicht aus und kann nicht rechtzeitig freigegeben werden. Gleichzeitig dient unsere Anforderung nur der Auslösung und muss nicht jedes Mal ausgeführt werden. Dann können wir die Verwendung der folgenden Methode in Betracht ziehen, um eine Duplizierung des Prozesses zu vermeiden.
$processId = realpath(__FILE__) . '-' . get_class($this); $filename = md5($processId); $file = '/tmp/'.$filename; if(!file_exists($filename)){ file_put_contents($file, getmypid()); }else{ return true; } ## do somthing 需要长时间处理的代码 //处理完成后删除进程id记录文件 unlink($file);
Verwandte Empfehlungen:
Das magische fastcgi_finish_request in PHP
Das obige ist der detaillierte Inhalt vonEinführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!