Hallo Martin,
Und ich habe gerade im Quellcode von PHP 5.3.6 nachgesehen. Sowohl fpassthru() als auch readfile() rufen intern die C-Funktion php_stream_passthru auf. Die legt einen lokalen Puffer von 8k Größe an (8192 Bytes) und kopiert dann in einer while-Schleife lauter 8k-Häppchen. Im Gegensatz dazu allokiert fread() einen Puffer in der angegebenen Größe und liest alles in einem Rutsch.
Damit ist beides erklärt: readfile() oder fpassthru() brauchen tatsächlich so gut wie keinen Speicher, und die Schleifenlösung mit fread() kann schneller als readfile() sein, wenn die gewählte Blockgröße deutlich >8k ist.
Danke für deine Recherche! Ich habe gerade auch mal einen lokalen Test (unter Windows) ausgeführt mit 10s max-execution-time, 2MB limit und einer 44MB-Datei bei einer simulierten 1MBit/s-Leitung. Das hat einwandfrei funktioniert - aber lokal ist eben nicht mit dem Server vergleichbar. Auf dem Server interpretiert er auch das "header("Content-Length: ".@filesize($filename));" richtig und der Browser sagt mir viel lange es noch ungefähr dauern könnte und lokal meint er immer die Restdauer wäre unbekannt.
Wenn ich jetzt readfile() nehme dürften aber mem-limit und max-execution-time (Beim Server momentan auf 32MB / 30s) keine Probleme machen und weitere halbwegs wahrscheinliche Fehlerquellen sollte es nicht geben, oder?
Gruß
Thomas