Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[php] Grote files doorsturen via header - probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi mensen,

Ik ben al een poosje bezig om files door te sturen na validatie van een e-mail.
Dit doe ik met header() en readfile().
Dat ging prima totdat de klant bestanden van 160mb wilde aanbieden als download.
Op dat moment vind de server mij niet meer zo fijn en zie ik in mijn error-log: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 171755521 bytes)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$path = $_uploadpath.$filename;

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
    
readfile($path);


Ik heb al gekeken naar X-sendfile en ook naar flushing voorafgaand aan de readfile.. vooralsnog geen succes.

PHP:
1
2
3
header("X-Sendfile: $path");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');


Iemand een tip?

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

fpassthru() al gevonden?

[ Voor 57% gewijzigd door CodeCaster op 04-12-2012 11:55 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 21-11 10:33
readfile() leest het bestand in 1x in en output deze. PHP gebruikt dus zo veel geheugen als het bestand groot is.

Eenvoudige workaround; slechts kleine delen tegelijkertijd inlezen
PHP:
1
2
3
4
$fp = fopen($path, 'rb');
while ($fp && !feof($fp) {
  echo fread($fp, 51200);
}

[ Voor 10% gewijzigd door frickY op 04-12-2012 11:57 ]


Verwijderd

Topicstarter
Yup,

fpassthru() en fread() ook geprobeerd. Deze geven dezelfde error.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$path = $_uploadpath.$filename;

$fp = fopen($path, 'rb');

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
    
fpassthru($fp);



PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$path = $_uploadpath.$filename;

$fp = fopen($path, 'rb');

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
    
while ($fp && !feof($fp) {
  echo fread($fp, 51200); 
}

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je kunt misschien het volgende gebruiken:

PHP:
1
    ini_set('memory_limit', '512M');


heb je bij 512 Mb weer een probleem :)

tis ook niet de meest nette oplossing, maar ik neem aan dat de klant niet iedere minuut een file van 160 Mb verwerkt?

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 23:22
Uit de PHP-manual:
Note:
readfile() will not present any memory issues, even when sending large files, on its own. If you encounter an out of memory error ensure that output buffering is off with ob_get_level().

Regeren is vooruitschuiven


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Voor X-Sendfile heb je ondersteuning in je web server software (apache, nginx, lighttpd, etc.) nodig; heb je dat?

https://tn123.org/mod_xsendfile/ voor apache.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 21-11 10:33
Ouch. Volkomen gelijk. En dat het probleem aanblijft met fread() bevestigd het.

Je hebt output buffering aan staan (Standaard in PHP5.3)
Call eerst ob_end_clean();

Verwijderd

Topicstarter
thanks voor de reacties.. ik ga ze even allemaal af! Als ik er uit kom laat ik het even weten.
Pagina: 1