Wenn große Dateien mit PHP
So, ich bin versucht, um zu dienen, große Dateien über ein PHP-Skript, sind Sie nicht im web zugänglichen Verzeichnis, so ist dies der beste Weg, ich kann herausfinden, Zugriff auf Sie zu geben.
Die einzige Art, wie ich denken konnte von der Fledermaus zu dienen, diese Datei wird durch das laden in den Arbeitsspeicher (fopen, fread, ect.), festlegen der header-Daten an den richtigen MIME-Typ haben, und dann nur als echo der gesamte Inhalt der Datei.
Das problem mit diesem ist, ich habe laden diese ~700MB Dateien auf einmal in den Speicher, und halten Sie die ganze Sache, bis der download abgeschlossen ist. Es wäre schön, wenn ich könnte-stream in die Teile, die ich brauche, wie Sie sind, herunterladen.
Irgendwelche Ideen?
unter anderem, ja
stackoverflow.com/questions/3697748/...
InformationsquelleAutor Adam | 2009-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um das ganze zu Lesen - geben Sie einfach eine Schleife Lesen Sie es in, sagen wir, 32 Stücke und senden es als Ausgang. Besser noch, verwenden Sie fpassthru tut viel die gleiche Sache für Sie....
noch weniger Zeilen wenn Sie readfile, das nicht braucht, wird der fopen-Aufruf...
Wenn Sie wollen bekommen Sie sogar noch niedlicher, unterstützen Sie den Content-Range - header, die es erlaubt, die Kunden verlangen einen bestimmten Bytebereich in der Datei. Dies ist besonders nützlich für die Zustellung von PDF-Dateien in Adobe Acrobat, die nur Anfragen die chunks der Datei, die es braucht zum Rendern der aktuellen Seite. Es ist ein bisschen beteiligt, aber sehen Sie, diese für ein Beispiel.
fpassthru() wurde berichtet als ein memory hog lädt die gesamte Datei in den Speicher. Nicht gut für große Dateien.
InformationsquelleAutor Paul Dixon
Der beste Weg, das senden von großen Dateien mit php ist die
X-Sendfile
header. Es ermöglicht dem webserver zur Bereitstellung von Dateien sehr viel schneller durch die zero-copy-Mechanismen wiesendfile(2)
. Es wird unterstützt von lighttpd und apache mit einem plugin.Beispiel:
Liest der server die
X-Sendfile
- header und sendet die Datei.InformationsquelleAutor d0k
Während
fpassthru()
wurde meine erste Wahl in der Vergangenheit, das PHP-Handbuch empfiehlt* mitreadfile()
statt, wenn Sie nur dumping die Datei wie Sie ist an den client.*
"Wenn Sie nur wollen, um einen dump der Inhalt einer Datei in den Ausgabepuffer, ohne die erste zu modifizieren oder suchen einen bestimmten offset, die Sie verwenden möchten, können Sie die readfile(), das spart Ihnen die fopen () - Aufruf." —PHP-HandbuchInformationsquelleAutor Henrik Paul
Wenn Sie Ihre Dateien nicht zugänglich sind, durch den web-server, weil der Pfad ist nicht in Ihrem Webserver-Verzeichnis (htdocs), dann kannst du einen symbolischen link (symlink) auf den Ordner in Ihrem Webserver-Verzeichnis zu vermeiden, vorbei an all den Verkehr Trog php.
Können Sie so etwas tun
Verwendung von php für die Auslieferung statischer Dateien ist deutlich langsamer, wenn Sie haben hohen traffic, Speicher-Verbrauch sehr groß und kann es nicht verarbeiten einer großen Anzahl von Anfragen.
InformationsquelleAutor codeassembly
Haben Sie einen Blick auf fpassthru(). In neueren PHP-Versionen sollte dies dazu dienen die Dateien, ohne Sie zu halten in Erinnerung, wie Sie dieser Kommentar Staaten.
InformationsquelleAutor Dan Soap
Seltsam, weder fpassthru() oder readfile() hat es für mich, hatte immer einen memory Fehler.
Ich Griff zu verwenden, passthru() ohne das 'f':
dieser execs "Katze" Unix-Befehl und sendet seine Ausgabe an den browser.
Kommentar schlank: der Grund, warum Sie einfach nicht, legen Sie einen symlink zu irgendwo webspace ist die SICHERHEIT.
InformationsquelleAutor Michel
Einer der Vorteile von fpassthru() ist, dass diese Funktion nicht nur Arbeit mit Dateien, aber keine gültigen Griff. Steckdose zum Beispiel.
Und readfile() muss ein wenig schneller, die Ursache der mit OS-caching-Mechanismus, wenn möglich (wie file_get_contents()).
Noch ein Tipp. fpassthru() gedrückt halten, öffnen und handhaben, bis der AUFTRAGGEBER erhält Inhalte (was eine ziemlich lange Zeit auf langsamen Verbindung), und so müssen Sie einige locking-Mechanismus, wenn parallel schreibt auf diese Datei möglich.
InformationsquelleAutor Denis Bazhenov
Python Antworten sind alle gut. Aber gibt es irgendeinen Grund Sie nicht können eine web zugängliche Verzeichnis symbolische links zu den eigentlichen Dateien? Es kann einige zusätzliche server-Konfiguration, aber es sollte funktionieren.
InformationsquelleAutor slim