2010-11-21 9 views
16

Kann jemand ein einfaches Beispiel zur Verwendung der Funktion fastcgi_finish_request() zeigen? Ich googelte aber fand nur einige allgemeine Erwähnung davon, einige Leute sagen, dass sie es erfolgreich verwenden, aber ich konnte kein einziges Beispiel mit Code finden.Beispiel für die Verwendung von fastcgi_finish_request()

Zum Beispiel habe ich ein PHP-Objekt. Um eine Antwort an einen Browser zu senden, erzeuge ich HTML, dann und gebe es über getResult() zurück. Dann echo das Ergebnis.

So:

$obj = new controller(); 
echo $o->getResult(); 

Sagen wir, ich Vorteil dieser Optimierungstechnik nehmen wollen Ergebnis Browser schicken und dann zu einem gewissen API einige potenziell langer Prozess beenden wie verbinden, wie vielleicht Facebook-API.

Wie würde ich das machen? Ich verstehe, dass ich grundsätzlich fastcgi_finish_request(); aufrufen kann und dann weiter PHP-Skript ausführen.

Ich muss nur Beispielcode sehen, ich bin nicht schlau genug, um es selbst herauszufinden.

+0

Ich weiß, es erfordert PHP läuft als fastcgi mit PHP-FPM. Ich habe es bereits so eingerichtet, mit php 5.3 als fastcgi und lighttpd als Webserver. – Dmitri

Antwort

35

Ich verstehe, dass ich grundsätzlich fastcgi_finish_request() aufrufen kann; und dann weiter PHP-Skript ausführen.

Ja, das ist alles, was Sie tun müssen.

$obj = new controller(); 
echo $o->getResult(); 
fastcgi_finish_request(); 
do_facebook_thing(); 

sich zu überzeugen, es funktioniert, dies tun:

echo "Test"; 
fastcgi_finish_request(); 
sleep(10); 

Wenn Sie die zweite Zeile entfernen, dann werden Sie sehen, dass der Browser 10 Sekunden warten muss.

+1

Gutes Beispiel. Ich habe es versucht und es hat funktioniert. – Dmitri

+0

So kann es anstelle von asynchronen Warteschlangen verwendet werden, um "Hintergrund-Job" (zum Beispiel E-Mail senden) zu tun? –

+1

@ThomasDecaux, könnte es, aber Sie würden immer noch an einem Webprozess festhalten, während diese Aufgabe ausgeführt wurde. Letztlich ist es sinnvoll, eine ordnungsgemäße Warteschlange zu verwenden, die vollständig von den Webprozessen getrennt ist, um Vorgänge zu blockieren, die für die zu bediende Seite nicht benötigt werden. – Matthew