fopen() + fread() fressen ram!

Atranox

Grünschnabel
Moin,

ich sende per folgendem Code eine Datei an den Client.

PHP:
$fd = fopen($mount . $_GET['file'], "r");
while( !feof($fd) ) {
  echo fread($fd, round(1024 * 256));
  ob_flush();
  flush();
}
fclose ($fd);

Das Problem ist nun bei größeren Dateien. Je länger der Download bei dem Client dauert, um so mehr ram wird gefressen.

Auszug aus top

Code:
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16878 nobody    15   0 89896  13m 4148 S    0  1.4   0:05.39 apache2
17050 nobody    15   0 89864  13m 4000 S    0  1.3   0:04.61 apache2
16909 nobody    15   0 89724  13m 4036 S    0  1.3   0:04.74 apache2
16882 nobody    15   0 89620  12m 4036 S    0  1.3   0:04.68 apache2
17214 nobody    15   0 89264  12m 4148 S    0  1.3   0:04.00 apache2
16825 nobody    15   0 89164  12m 4028 S    0  1.3   0:04.55 apache2
16827 nobody    15   0 88848  12m 4148 S    0  1.3   0:04.34 apache2
16886 nobody    15   0 88948  12m 4152 S    0  1.2   0:03.59 apache2
16966 nobody    15   0 88844  12m 4020 S    0  1.2   0:04.12 apache2
16890 nobody    15   0 88432  12m 4040 S    0  1.2   0:03.72 apache2
17229 nobody    15   0 88196  12m 4148 S    0  1.2   0:03.89 apache2
17005 nobody    15   0 88148  11m 4152 S    0  1.2   0:03.66 apache2
17045 nobody    15   0 88148  11m 4148 S    0  1.2   0:03.55 apache2
16821 nobody    15   0 88268  11m 4040 S    0  1.2   0:03.69 apache2
17051 nobody    15   0 88460  11m 4148 S    0  1.2   0:03.47 apache2
16929 nobody    15   0 88012  11m 4156 S    0  1.2   0:03.73 apache2
16908 nobody    15   0 88564  11m 4040 S    0  1.2   0:03.38 apache2
17046 nobody    15   0 88076  11m 4036 S    0  1.2   0:03.58 apache2
16885 nobody    15   0 88396  11m 4156 S    0  1.2   0:03.18 apache2
16826 nobody    15   0 88292  11m 3996 S    0  1.2   0:03.23 apache2
17225 nobody    15   0 88172  11m 4028 S    0  1.2   0:03.33 apache2
16888 nobody    15   0 87776  11m 4148 S    0  1.2   0:03.15 apache2

1. Was frisst so viel ram? Ich benutze doch flush()?
2. Ja, es soll diese Funktion sein.

Danke, Gruß Simon
 
[phpf]ob_flush[/phpf] sendet zwar den Ausgabepuffer, leert ihn aber nicht. Er bleibt erhalten. Versuch es mal mit [phpf]ob_end_flush[/phpf].
 
Zurück