Fájlletöltés php-val egyszerűbben

szerda, szeptember 1, 2010 @ 10:09 DE. Author: Krisztián Kővári

Kisebb fileok esetén a hagyományos fopen(), fpassthru() párosítás tökéletesen megfelel arra, hogy a weboldalunkon php segítségével tudjon a látogató fileokat letölteni. A probléma akkor lép fel, ha a fájlunk túl nagy, illetve a php-nak megadott memória limit túl alacsony. Lassú letöltésesetén pedig a php timeout-al is elszállhat.

Az apache-hoz létezik egy modul, aminek a neve: mod_xsendfile
Ubuntuban megtalálható csomagban, így viszonylag egyszerű telepíteni: apt-get install mod_xsendfile
Telepítés után automatikusan aktiválja magát, nem kell engedélyezni külön az apacheban, viszont meghagyja nekünk a jogot, hogy a webszervert újraindíthassuk.

A .htaccess fájlunkba a következő két sort kell betenni:
XSendFile On
XSendFileAllowAbove on

Az utolsóra különösen akkor van szükségünk, ha a php fcgi módban fut.

A php forrásunkba pedig a letöltés részhez csak néhány header utasítást kell beszúrnunk:

header(“Content-Disposition: attachment; filename=”$filename”");
header(“X-Sendfile: $filename”);
exit;

Az X-Sendfile paraméter megadásánál arra kell figyelni, hogy a teljes útvonalat tartalmazza a gyökérkönyvtártól (/var/www/vhost/files/…), ellenkező esetben nem fogja megtalálni a filet.

Tesztelgetésem során a következőket tapasztaltam:
- Gyorsabb, stabilabb letöltés
- Kevesebb memóriahasználat