2012-11-30 2 views
8

ich ein langes Skript in PHP als solche gemacht:Lange Lauf Hintergrund PHP-Skript blockiert andere PHP-Seiten, bis es fertig ist

ignore_user_abort(true); 
set_time_limit(0); 

Es läuft perfekt im Hintergrund, auch wenn ich die Seite zu schließen. Mein Problem ist, dass ich andere PHP-Dateien nicht öffnen kann, bis dieses Skript im Hintergrund ausgeführt wird. Wie kann ich dieses Problem lösen?

+1

Does langwierige Verarbeitung tun dieses Skript plus t er Seiten, die gesperrte Nutzung Sitzungen bekommen? –

+0

Bis das lange Skript läuft oder bis es fertig ist? – cegfault

+0

@SalmanA Ja, meine Dateien verwenden Sitzungen, ist das Problem? – martincpt

Antwort

17

Wenn ein PHP-Skript Sitzungen verwendet, sperrt PHP die Sitzungsdatei, bis das Skript abgeschlossen ist. Eine Seitenanforderung, die versucht, eine gesperrte Sitzung zu verwenden, wird blockiert, bis die Sitzungsdatei freigegeben wird. PHP tut dies, damit Sitzungen in einem konsistenten Zustand bleiben. Quote from PHP bug #31464:

[2005-01-10 08.13 UTC] derick bei php dot net

Dies ist in der Tat nicht um ein Problem überhaupt, muss die Session Erweiterung die Session-Datei, so dass gleichzeitig sperren Updates können die Datei nicht beschädigen. Dies bedeutet, dass alle Skripte, die die gleiche Sitzungsdatei verwenden, serialisiert sein müssen. Um die Leistung zu verbessern, können Sie http://php.net/session_write_close verwenden, sobald Sie fertig sind Lesen/Einstellen von Sitzungsvariablen, die die Sperre der Datei entfernen wird.

Die einfachste Abhilfe, wie oben und here as well beschrieben ist:

  • Anruf session_start()
  • Lese-/Schreib alle Session-Variablen
  • Aufruf session_write_close()
4

Wie in den Kommentaren erwähnt, sind Sitzungen das Problem - dies ist, weil die Sitzungsdatei gesperrt ist.

Verwenden Sie session_write_close() in Ihrem lang laufenden Skript zum Entsperren der Sitzungsdatei, aber beachten Sie, dass Sie $_SESSION Variablen in diesem bestimmten Skript danach nicht verwenden können.

+0

Vielen Dank für Ihre Antwort Kolink, ich bot an, SalmanA's Antwort zu akzeptieren, wenn er eine schreiben möchte, weil er der Erste war. Anderen Fällen werde ich Ihre Antwort akzeptieren. – martincpt

Verwandte Themen