"Content-Disposition: attachment" d'un gros fichier - PHP - Programmation
Marsh Posté le 07-06-2011 à 20:41:10
j'entends également parler de symlink() dont je ne sais pas exactement l’intérêt.
ainsi que:
http://stackoverflow.com/questions [...] bly-in-php
où readfile() semble effectivement streamer le fichier demandé.
up
http://stackoverflow.com/questions [...] apache-php
http://www.jasny.net/articles/how-i-php-x-sendfile/
Marsh Posté le 07-06-2011 à 21:55:03
bon j'ai trouvé, ça fonctionne nickel avec le mod "x-sendfile"
pour ceux trouveront ce topic via google... :
sur une gentoo:
1) comme je suis sur un dédié chez ovh en release2:
ln -s /usr/local/apache/bin/apxs /usr/sbin/apxs2 |
2) ensuite il faut télécharger mod_xsendfile.c ici https://tn123.org/mod_xsendfile/
3) et l'installer:
apxs2 -cia mod_xsendfile.c |
4) redémarrer apache pour prendre en compte les changements.
5) rajouter ça dans un le .htaccess:
XSendFile On |
ça marche comme il faut: avec le fichier source masqué, la fonction de reprise, le filesize...
dans php je déclare en 3 lignes seulement, tel que:
|
voilà.
le load average qui passe de 1,36 avec readfile(), à 0,07 avec x-sendfile, raaaah
Marsh Posté le 07-06-2011 à 19:53:22
bonjour,
dans l'idée de masquer le répertoire dans lequel se trouvent mes fichiers, mes visiteurs tombent sur une page de type
telecharger.php?fichier=67576dsdqd&key=8767gfjdhsfdz
avec donc, en paramètre: le fichier désiré (encodé), et une key avec un salt, du md5, etc, qui prend en compte l'ip et compagnie, avec connexion à la bdd, etc, bref le gros tralala pour éviter qu'il ne partage ce lien de téléchargement unique...
si le visiteur et autorisé à télécharger le fichier, alors je le lui envoie tel que, en gros:
[...]
header("Content-Type: application/force-download; name=\"" . $file . "\"" );
header("Content-Disposition: attachment; filename=\"fauxnomdefichier.zip\"" );
readfile($file);
exit();
[...]
c'est un code qui fonctionne très bien pour des petits fichiers de +- 500Mo.
par contre mon serveur dédié ne répond plus pendant un petit moment quand j'essaye de balancer un gros fichier. quand je dis "gros fichier" ça veut dire au moins 2Go
bon j'imagine que le fonctionnement de ce bout de code est tel que php, avec readfile, ouvre mon fichier de +2Go avant de l'adresser au visiteur, donc forcément ça patine, même avec un Xeon et 16Gb de ram
donc je chercher un code plus adéquat et bien indiqué pour ce genre de téléchargement. est-ce qu'il faudrait pas voir du côté des ob_clean() et flush() par exemple?
rien trouvé sur google, en français comme en anglais.
merci.