| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

02-03-2011, 11:06
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
readfile / readfile_chunked Problem
Hallo Leute!
Ich habe ein kurioses Problem.
Ich leite Dateien via readfile bzw. readfile_chunked an den Benutzer weiter.
Das funktioniert auch an sich einwandfrei und auch rattenschnell, aber ab ca. genau 20 MB klappt das nicht mehr, und der Internet Explorer bricht nach ein paar Sekunden ab.
Ich erhalte keinerlei Fehlermeldungen, der Browser hört einfach auf und quittiert mit einer Internet Explorer Eigenen Fehlerseite.
Auch in den beteiligten Log-Dateien steht keinerlei Fehler, Warnung oder Hinweis.
Meine Maximum Execution und Input Time liegen jeweils bei 480 Sekunden.
Mein Memory Limit bei 512 MB.
Des weiteren tritt das Problem nicht nur bei readfile, sondern auch bei readfile_chunked auf, dort ändert sich nichts.
Als Webserver benutze ich einen Apache 2.
Mir gehen aktuell die Ideen aus, zumal alles was ich im Netz finden konnte, wahlweise mit readfile_chunked funktioniert hat, oder das Problem offen stehen geblieben ist.
Hat vielleicht wer eine Idee?
Danke im Voraus
Patrick
|

02-03-2011, 11:23
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Sendest du Header, die nicht zum Payload passen, z.B. Content-Length <=20MB und dann >20MB Daten?
Zeig mal den Code!
|

02-03-2011, 11:24
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Hast du schonmal ein Tool zum mitlesen der http-header benutzt? Evtl. findet sich da ein Hinweis.
Was ist readfile_chunked? Kann die Funktion im PHP-Manual nicht finden - auch kein Hinweis auf eine ähnlich benamte Funktion im Manual unter PHP: readfile - Manual
EDIT:
Ok - wahrscheinlich das aus den User Contributed Notes.
Tippe wie onemorenerd auch auf ein Problem mit den Headern.
__________________
Drelingdo
Krabonse
Simmannamando
Geändert von Quetschi (02-03-2011 um 11:30 Uhr)
|

02-03-2011, 11:57
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Also das hier ist der entsprechende Quellcode was den Download betrifft.
PHP-Code:
// download the file
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=abc.zip');
header('Content-Length: ' . $size);
readfile_chunked($target);
Ich habe wie gesagt schon readfile, sowie readfile_chunked probiert. Beides das gleiche Ergebnis.
Auch habe ich die Länge komplett weggelassen, kein Erfolg.
Bei der 20 MB Datei beträgt die Länge z.B. ~21.000.000 Bytes, ist also korrekt.
Als Content-Type habe ich auch zusätzlich schon force-download probiert, ebenfalls kein Erfolg.
Das seltsame ist für mich, dass der Browser bereits nach max. 2, 3 Sekunden weiß, dass er nix zu tun hat und mit "Die Webseite kann nicht angezeigt werden." antwortet...
|

02-03-2011, 12:02
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Verwendest du HTTPS?
Woher kommt $size?
|

02-03-2011, 12:05
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Ich wiederhole mich - Header beobachten - da dürfte der Hund begraben liegen.
__________________
Drelingdo
Krabonse
Simmannamando
|

02-03-2011, 12:09
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Ja, ich verwende HTTPS.
Spielt das dabei eine Rolle?
$size kommt hier her
PHP-Code:
$size = filesize($target);
$target ist der Pfad zur Datei.
|

02-03-2011, 12:13
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Errraddicator
Ja, ich verwende HTTPS.
Spielt das dabei eine Rolle?
|
Ja, eine sehr große. Der IE führt sich auf wie eine Diva, wenn es um HTTPS geht. Der braucht immer ganz spezielle Header. Google hilft weiter.
|

02-03-2011, 12:16
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Die Funktion readfile_chunked aus den User Comments auf PHP: readfile - Manual gibt, so wie du sie aufrufst, ein Array zurück. Würdest du das wie einen String ausgeben, wäre das Ergebnis nur "Array". Doch du gibst es gar nicht aus! Anders als readfile() schreibt readfile_chunked() nämlich nicht direkt in den Ausgabepuffer.
Übrigens ist diese Funktion ziemlicher Mist. Wenn man als zweiten Parameter "string" übergibt, erhält man nur die letzte Zeile. Wenn man irgendwas außer "array" und "string" übergibt, erhält man eine Warnung und NULL. $buffer wird überhaupt nicht verwendet.
Merke: Nicht alles in den UC ist gut!
Machs doch erstmal mit readfile(). Wenn das funktioniert, kannst du ja versuchen, chunked transfer umzusetzen - falls du es überhaupt brauchst.
Edit: Jetzt sehe ich erst, dass es weiter unten in den UC eine weitere Version von readfile_chunked gibt, die auf den ersten Blick besser aussieht. Auch nicht das Gelbe vom Ei, aber sollte wenigstens funktionieren.
Geändert von onemorenerd (02-03-2011 um 12:22 Uhr)
|

02-03-2011, 12:39
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Hab mich auch grad kirre gemacht was die Funktion überhaupt bringen soll
Bin auch der Meinung, dass erstmal readfile benutzt werden sollte um das zum laufen zu bringen - chunked-Transfer kann man sich dann im Anschluss ansehen. Und das hat ja auch nicht damit zu tun, ob man die Datei nur häppchenweise in PHP ausliest. Es muss dann ja vor jedem Chunk noch die Information in der Ausgabe bereitgestellt werden, wie lang das jeweilige Stückchen ist.
__________________
Drelingdo
Krabonse
Simmannamando
|

02-03-2011, 12:46
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Ne ne, also die readfile_chunked funktion funzt schon einwandfrei, aber eben (genauso wie readfile!) nur bis zu der Grenze von ca. 20 MB.
Des Weiteren habe ich die Funktion etwas gekürzt (was Ihr nich wissen konntet, aber eigentlich auch nix zur Sache tut, da ich ja geschrieben habe, dass sie per se einwandfrei funktioniert *G*)
PHP-Code:
function readfile_chunked($filename)
{
$chunksize = 256 * 1024; // how many bytes per chunk
$handle = fopen($filename, 'rb');
if($handle !== false)
{
while(!feof($handle) )
{
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
}
fclose($handle);
}
}
Aber wie gesagt is das ja eigentlich auch völlig latte, weil ich mit readfile 1:1 das gleiche Verhalten bekomme.
Ich vermute mal, das Problem wird hier wirklich der IE in Kombination mit dem HTTPS sein.
Muss ich mal schauen, ob ich hierzu einen Anhaltspunkt finde.
Geändert von Errraddicator (02-03-2011 um 12:48 Uhr)
|

02-03-2011, 16:23
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Also ich konnte das Problem noch weiter einschränken.
Das Problem tritt NUR bei .zip Dateien auf.
Wenn ich z.B. über die gleiche Methodik eine 40 MB PDF-Datei downloaden möchte klappt das einwandfrei. Habe ich (wie in meinem Fall) eine 20 MB .zip-Datei, so kommt die Fehlermeldung / bricht der Internet Explorer ab.
Selbst wenn ich die Endung wegnehme kommt dieser Fehler, da er anscheinend nicht nach der Endung geht, sondern den Inhalt auf Dateityp überprüft.
Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.
Irgendwie bin ich gerade überfragt, wie ich das in den Griff kriegen soll
|

02-03-2011, 16:25
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Errraddicator
Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.
|
Dann stimmt was mit den Headern nicht. Hast du dir die Header jetzt eigentlich schon angeschaut?
|

02-03-2011, 16:29
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Angeschaut schon, aber da stand jetzt für mich nix sinnvolles drin.
Wonach soll ich dort denn ausschau halten?
Und wenn der Header generell falsch ist, warum funktioniert es dann mit 40 MB PDF Dateien, 20 MB TXT-Daten und 18 MB zip-Daten, aber nicht mit > 20 MB zip Daten?
Da will sich mir die Systematik nicht so recht erschließen, wenn ich ehrlich bin.
|

02-03-2011, 17:10
|
|
Errraddicator
Registrierter Benutzer
|
|
Registriert seit: Dec 2005
Beiträge: 9
|
|
Das Problem konnte ich zwar immer noch nicht lokalisieren, aber ich habe zumindest eine Umgehung geschaffen, indem ich die Datei nun verlinke und nicht per readfile ausgebe.
Das funktioniert seltsamerweise. 
Nun muss der Benutzer halt einmal mehr klicken... Nicht ideal, aber besser wie nur Teildaten zu erhalten allemal.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|