Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code

Einführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code

不言
不言Original
2018-08-25 17:21:123368Durchsuche

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.

Vorwort

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.

Basisanwendung

Einführung in fastcgi_finish_request

(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.

Rückgabewert

Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück

Hinweise

  • 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.

Anwenden

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

Einführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code

Einführung in fastcgi_finish_request in PHP und seinen nicht blockierenden Code

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.

Stellen Sie sicher, dass der Prozess in einem einzigen Prozess ausgeführt wird

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

PHP verwendet die Funktion fastcgi_finish_request(), um asynchrone Vorgänge zu implementieren und die Reaktionsgeschwindigkeit verbessern

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn