"Content-Disposition: attachment" d'un gros fichier

"Content-Disposition: attachment" d'un gros fichier - PHP - Programmation

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  :D  
 
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 :D  
 
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.  

Reply

Marsh Posté le 07-06-2011 à 19:53:22   

Reply

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  :bounce:  
 
http://stackoverflow.com/questions [...] apache-php
 
http://www.jasny.net/articles/how-i-php-x-sendfile/


Message édité par pimsa le 07-06-2011 à 20:45:48
Reply

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
XSendFileAllowAbove 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:


header('X-Sendfile: '.$file);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachement; filename="'.basename($file).'"');
exit;

 

voilà.

     


le load average qui passe de 1,36 avec readfile(), à 0,07 avec x-sendfile, raaaah  [:nico54]

 

[:pimsa]  [:pimsa]  [:pimsa]  [:pimsa]


Message édité par pimsa le 07-06-2011 à 21:56:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed