Simultane PHP-Skripte ausführen

7

Ich habe das folgende Problem mit meinem VPS-Server.

Ich habe ein lang laufendes PHP-Skript, das große Dateien an den Browser sendet. Es macht so etwas:

%Vor%

Dies liest die Datei grundsätzlich vom Dateisystem des Servers und sendet sie an den Browser. Ich kann nicht einfach direkte Links verwenden (und Apache die Datei bereitstellen), weil in der Anwendung Geschäftslogik vorhanden ist, die angewendet werden muss.

Das Problem besteht darin, dass die Website während eines solchen Downloads nicht auf andere Anforderungen reagiert.

    
Emil M 17.01.2012, 11:41
quelle

6 Antworten

30

Das Problem, auf das Sie stoßen, hängt mit der Tatsache zusammen, dass Sie Sitzungen verwenden. Wenn ein Skript eine laufende Sitzung ausführt, wird die Sitzungsdatei gesperrt, um gleichzeitige Schreibvorgänge zu verhindern, die die Sitzungsdaten beschädigen können. Dies bedeutet, dass mehrere Anfragen vom selben Client - die dieselbe Sitzungs-ID verwenden - nicht gleichzeitig ausgeführt werden, sondern in die Warteschlange gestellt werden und nur jeweils einzeln ausgeführt werden können.

Bei mehreren Benutzern tritt dieses Problem nicht auf, da sie unterschiedliche Sitzungs-IDs verwenden. Dies bedeutet nicht, dass Sie kein Problem haben, da Sie möglicherweise während des Downloads einer Datei auf die Site zugreifen oder mehrere Dateien gleichzeitig herunterladen möchten.

Die Lösung ist eigentlich sehr einfach: Rufen Sie session_write_close() auf bevor Sie anfangen Ausgabe der Datei Dadurch wird die Sitzungsdatei geschlossen, die Sperre wird aufgehoben und weitere gleichzeitige Anforderungen können ausgeführt werden.

    
DaveRandom 17.01.2012, 12:11
quelle
2

Ihr Server-Setup ist wahrscheinlich nicht der einzige Ort, den Sie überprüfen sollten.

Versuchen Sie wie gewöhnlich, eine Anfrage von Ihrem Browser zu machen und dann eine andere von einem anderen Client zu machen.

Entweder wget von der gleichen Maschine oder einem anderen Browser auf einer anderen Maschine.

    
zaf 17.01.2012 12:13
quelle
1

Wie reagiert der Server nicht auf andere Anfragen? Ist es "Waiting for example.com ..." oder gibt es irgendeinen Fehler?

Ich mache etwas ähnliches, aber ich diene der Datei chunked, die dem Dateisystem eine Pause gibt, während der Client einen Chunk akzeptiert und herunterlädt, was besser ist, als das gesamte Ding auf einmal anzubieten, was ziemlich anspruchsvoll für die Datei ist System und der gesamte Server.

EDIT: Obwohl nicht die Antwort auf diese Frage, fragte Asker über das Lesen einer Datei chunked. Hier ist die Funktion, die ich verwende. Geben Sie den vollständigen Pfad zur Datei an.

%Vor%     
i-CONICA 17.01.2012 11:45
quelle
0

Ich habe verschiedene Ansätze ausprobiert (Lesen und Senden der Dateien in kleinen Brocken [siehe Kommentare zu readfile in PHP doc], mit PEARs HTTP_Download), aber ich lief immer auf Leistungsprobleme, wenn die Dateien groß werden.

Es gibt einen Apache mod X-Sendfile , wo Sie Ihre Geschäftslogik ausführen und dann den Download an Apache delegieren können. Der Download ist nicht öffentlich verfügbar. Ich denke, das ist die eleganteste Lösung für das Problem.

Weitere Informationen:

DerVO 17.01.2012 12:07
quelle
0

Das gleiche passiert mir und ich benutze keine Sitzungen. session.auto_start wird auf 0 gesetzt Mein Beispielskript führt nur "sleep (5)" aus, und das Hinzufügen von "session_write_close ()" am Anfang löst das Problem nicht.

    
Ignacio Vazquez 09.03.2015 12:34
quelle
0

Überprüfen Sie Ihre httpd.conf-Datei. Vielleicht haben Sie "KeepAlive On" und deshalb bleibt Ihre zweite Anfrage hängen, bis die erste abgeschlossen ist. Im Allgemeinen sollte Ihr PHP-Skript den Besuchern nicht erlauben, lange Zeit zu warten. Wenn Sie etwas Großes herunterladen müssen, tun Sie dies in einer separaten internen Anfrage, auf die der Benutzer keine direkte Kontrolle hat. Bis es soweit ist, geben Sie dem Endbenutzer einen "Ausführungsstatus" zurück, und wenn das erledigt ist, verarbeiten Sie die tatsächlichen Ergebnisse.

    
Alex Fedorov 23.04.2015 09:57
quelle

Tags und Links