Apache frisst speicher

C

clausmuus

Guest
Hi,

beim Versuch eine grosse Datei per php-script auszuliefern, also nicht durch nen Link auf die Datei, entsteht folgendes Problem.
Ich setze nen Apache 2.0 und PHP 4.3 unter suse 9.1 ein.
Unter Apache 1.3 besteht dieses Problem nicht!
Der auslieferne Apache-Prozess belegt ca. doppelt soviel Speicherplatz wie die gesendete Datei gross ist. Der Speicher wird nach abgeschlossenem Download nicht sofort wieder freigegeben, sondern erst wenn der Apacheprozess für andere Aufgaben benötigt wird. Ich versende die Datei in 4kB blöcken (per fread und print). Somit braucht php nur sehr wenig Speicher.
Bei kleinen Datein bis ca. 5 MB fällt dieses Verhalten von Apache überhaupt nicht auf, sollen jedoch 100MB grosse Datein runtergeladen werden, schmirt mir das gesammte System ab, sobald mehrere Downloads paralel laufen (aus Speichermangel).
Was kann ich nun tuen, um Apache dieses äusserst unangenehme Verhalten abzugewöhnen?

Claus
 
Kannst du mal die wichtigen Codepartien posten?

Hast du schon mal versucht einfach einen header() zu senden?
 
Hi Alain,

im wesendlichen lässt sich das schon mit diesen Zeilen nachvollziehen:
QUOTE $fd = fopen("my_data.bin", "rb");
while(!feof($fd)) {
echo fread($fd, 4096);
flush();
}
fclose ($fd);

Ich sende zwar auch header-Informationen um nen Download zu fossieren, jedeoch tritt das Problem unabhängig von den gesendeten Headeren auf. Es ist also egal ob ich überhaupt nen Header vorweck schicke, oder beispielsweise nen no-Caching Header schicke. Ich habe auch die php Komprimierung per ini_set() abgeschalet.

Claus
 
Hi Roger,

mit fpassthru() benötigt Apache zwar nicht mehr ganz so viel Speicher, aber immernoch wesendlich mehr als die Datei gross ist, und freigeben tut Apache den auch nicht sofort. Eigendlich würde ich erwarten das Apache die datei nur durchreicht und somit keinen nennenswerten Speicherbedarf hat...

Claus
 
Zurück
Oben