phpbar.de logo

Mailinglisten-Archive

[php] readfile und Apache Prozessgröße

[php] readfile und Apache Prozessgröße

Mathias Helm mhe at ltcgroup.de
Mon Sep 5 10:15:34 CEST 2005


> ist jemandem von euch schonmal aufgefallen das wenn man per readfile  
> Inhalt
> ausliefert die Größe des Apache-Prozesses beeinflusst wird da er  
> scheinbar
> die Daten im ganzen Block im Speicher hält?
> Ich liefer per readfile Dateien aus die z.B. 70-80 MB groß sind und habe
> seit dem httpd-Prozesse mit ebenfalls etwas mehr als dieser Größe. Ich  
> kann
> mir nichts anderes vorstellen woran es liegen könnte.

dazu muss man wissen, was readfile macht.
es liest den kompletten inhalt der datei in den speicher,
bevor es wieder ausgegeben wird, d.h. der prozess muss
die datei erstmal oeffen und komplett einlesen, und es im
speicher dann aufbereiten. das kann u.u. ein paar sekunden
dauern, weil erst wen das abgeschlossen ist, kann es weitergehen ..

wen du jetzt 70 bis 80mb dateien damit auslieferst, hast
du memory_limit bestimmt auf 0 setzen muessen, damit es funktioniert.
nicht so clever, den mit ein paar gleichzeitigen anfragen des downloads
kannst du dir den server "dicht machen" lassen ..

besser ist, da nimmst zum ausliefern solch grosser dateien
eine kombination von fread/feof in einer while schleife.

schneller und resourcenschonender ..

	// oeffne datei
	$fp = fopen("yourfileher", "r);
	// solange das ender der datei noch nicht erreicht wurde, mache schleife
	while(!feof($fp))
	{
		// gibt inhalt der datei aus
		// lies dazu maximal 8192 bytes
		// oder soviel, wie noch drin ist
		echo fread($fp, 8192);
	}

http://de3.php.net/fopen
http://de3.php.net/feof
http://de3.php.net/fread

clever waere vielleicht noch nur 1024 bytes oder so zu lesen und  
auszugeben,
und gleich zu flushen.

ciao
  Mathias


php::bar PHP Wiki   -   Listenarchive