Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/01/2011, 01h44   #1
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Par défaut Problème de header pour forcer le téléchargement, site figé

Bonjour,

Voilà j'ai un petit problème de script, je code donc un site où on peut télécharger des fichiers allant de 1Ko à plus de 500Mo, les fichiers viennent de mon serveur mais le plus souvent ils viennent de serveurs externes.

Jusque là tout fonctionne, les fichiers passent à travers un fichier file.php, précisés par plusieurs variables GET pour désigner le fichier à télécharger, et un header est envoyé pour forcer le téléchargement, changer plusieurs variables statistiques au passage, etc.

Le gros problème, dont je ne m'étais même pas rendu compte pendant la création de ce script il y a quelques semaines, c'est qu'une fois un téléchargement lancé, l'utilisateur ne peut naviguer nul part sur mon site, les pages "chargent", et n'aboutissent à rien avant la fin du téléchargement des fichiers qui passent à travers le header (on est donc obligé d'annuler le téléchargement pour pouvoir faire quelque chose sur le site).

Après quelques tests, j'ai pu voir que cela ne touchait pas le site entier; cela concerne uniquement l'user qui télécharge, pas les autres users naviguant (ce qui est quand même une bonne nouvelle vu le contexte).

Bon évidemment vous l'imaginez, lorsqu'on télécharge un fichier de 500Mo, il faut plusieurs heures pour le finir et le fait que mon site soit complètement figé pour l'user concerné c'est très très gênant, et frustrant pour celui-ci.

J'ai cherché sur Internet et n'ai pas trouvé de cas similaire - je suppose que j'ai mal cherché - je suppose que le problème est dû au fait que le header fait passer le fichier concerné par mon site et qu'aucune autre header (donc page) ne peut être envoyé à l'user avant la fin du chargement.

Y a-t-il une solution ? Est-ce une erreur de ma part ?

Voici le code...

Code :
1
2
3
4
5
6
7
8
9
 
header("Content-disposition: attachment; filename=".basename($local_file)."\n"); 
header("Content-Type: application/force-download\n"); 
header("Content-Transfer-Encoding: octet-stream\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".$local_file_size."\n"); 
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public\n"); 
header("Expires: 0\n"); 
readfile($local_file);
Je ne vois pas trop de solution, si quelqu'un pouvait me dire que c'est simplement un mauvais paramètre dans le header, ça me sauverait vraiment !

Merci de m'avoir lu
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 09h09   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Je verrais plus un problème au niveau du serveur web ou du client que de PHP lui même.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 12h12   #3
Membre régulier
 
Inscription : juin 2004
Messages : 66
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 66
Points : 86
Points : 86
J'ai moi même rencontré ce problème.
Le solution consiste à terminer la session avant l'envoi des données.

Code :
1
2
3
4
5
6
7
8
9
10
11
header("Content-disposition: attachment; filename=".basename($local_file)."\n"); 
header("Content-Type: application/force-download\n"); 
header("Content-Transfer-Encoding: octet-stream\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".$local_file_size."\n"); 
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public\n"); 
header("Expires: 0\n");
 
session_write_close();
 
readfile($local_file);
Blount est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/01/2011, 21h06   #4
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Non ce n'est pas un problème de serveur puisque j'ai fait le test en local et en ligne

Après beaucoup de recherche j'ai pu arriver à une conclusion similaire Blount, je vais tester cela immédiatement ! Merci

Edit: ça marche nickel, merci infiniment, je me demande pourquoi les session sont en conflits avec les header comme ça.
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 00h48   #5
Membre régulier
 
Inscription : juin 2004
Messages : 66
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 66
Points : 86
Points : 86
Citation:
Envoyé par MaXOhBalle Voir le message
Non ce n'est pas un problème de serveur puisque j'ai fait le test en local et en ligne

Après beaucoup de recherche j'ai pu arriver à une conclusion similaire Blount, je vais tester cela immédiatement ! Merci

Edit: ça marche nickel, merci infiniment, je me demande pourquoi les session sont en conflits avec les header comme ça.
En fait cela n'a rien à voir avec les header.

Les données de session sont bloqués en écriture durant l'exécution d'une requête. Tout au long de l'exécution de celle-ci, les autres requêtes seront bloqué du au verrou sur la session.
Tant que le verrou n'est pas libéré, le page est "en attente".
Et effectivement, dès que le téléchargement est terminé, le verrou est libéré et tout de suite les autres requêtes reprennent.

L'explication n'est pas forcément parlante pour tous le monde.
Blount est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 01h49   #6
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Je comprends mieux, merci en tout cas
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h35.


 
 
 
 
Partenaires

Hébergement Web