Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
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 31/08/2011, 16h25   #1
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
Par défaut téléchargement par readfile() ne fonctionne plus

Bonjour,
j'ai ce petit script qui envoie des gros fichiers son (>200Mo):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
header('Content-Description: File Transfer');
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$nom.zip") ;
  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("./files/$nom.zip") );
 
  ob_clean() ;
  flush();
  readfile("./files/$nom.zip");
ça fonctionnait parfaitement, mais depuis un moment, il ne télécharge le fichier qu'a moitié: un fichier de 390Mo s'arrête à 192 ou 240 ou autre aléatoirement. Je crois que ce problème se croise avec le passage de mon serveur mutualisé en fastcgi...
je ne sais pas par où commencer à chercher...
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 16h43   #2
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149


Que dit le log PHP ? Ce ne serait pas un problème d'occupation mémoire par hasard ?

Pour de gros fichiers, je ne te conseille pas readfile, qui lit le fichier en une seule fois et consomme donc beaucoup de mémoire. Fais plutôt une boucle de fread (comme dans l'exemple 3 de la doc de cette fonction), qui lit et envoie une petite portion à chaque fois, ce qui consomme moins de mémoire
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 16h49   #3
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
alors bien possible pour la mémoire... le serveur vient de planter après un essai
mais ça a un lien avec fastcgi? Je vais aussi vérifier (quand ce sera rétabli) la limite de mémoire... et je regarde pour fread()
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 19h17   #4
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
bon, c'est rétabli...
et donc les limites de mémoire ont doublée par rapport à l'autre serveur (96Mo), le temps d'exécution aussi (60)...
dans le log du serveur j'ai:
Citation:
[Wed Aug 31 18:57:46 2011] [warn] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request function
je trouve où le log php?
fread, je suis pas sûr...
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 22h43   #5
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
chez moi c'est /var/log/php/error.log sinon tu fais
Code :
1
2
 
print_r(ini_get('error_log') );
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 12h34   #6
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
bon, je n'ai pas accès au serveur, et ta commande ne retourne rien, pas étonnant, la valeur php_log est à 'no value'...
entre temps j'ai trouvé ça...
il faut donc ajouter ça au 'wrapper script' (??):
Code :
1
2
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
Peu de chance que mon hébergeur le fasse, mais j'essaye... sinon je me retournerai vers fread(), mais est-ce que je contournerai le problème?
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 15h09   #7
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
aucun résultat avec fread():
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
header('Content-Description: File Transfer');
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$nom.zip") ;
  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("./files/$nom.zip") );
 
  ob_clean() ;
  flush();
  $handle = fopen('./files/$nom.zip' , 'rb' ) ;
  while (!feof($handle)) {
  	$buffer = fread($handle, 1048576 );
  	echo $buffer ;
  	ob_flush() ;
  	flush() ;
	}
  fclose($handle) ;
et des variantes...
sur mon serveur local (en mod_php), il télécharge un petit peu puis s'arrête (~62Mo / 290Mo), et sur le serveur il attend un moment puis me met une 'internal server error'...
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h49   #8
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149
"Internal Server Error" signifie une erreur PHP qui n'est pas affichée. Active le log PHP et regarde son contenu, on ne pourra pas avancer sans ça. 2 conseils par rapport à ton utilisation de fread : enlève les flush, et réduit le nombre d'octets lus à chaque coup (mets 4096, c'est un grand classique ).
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 10h54   #9
Membre du Club
 
Inscription : mars 2007
Messages : 116
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 116
Points : 52
Points : 52
merci david:
j'ai retiré les fonctions buffer et mis 4096.
Comme avant, il patiente un moment puis affiche une 'internal server error' 500.
Le log du serveur:
Code :
Premature end of script headers: download.php
Je n'arrive pas à avoir les erreurs php:
Code :
1
2
error_reporting(E_ALL);
ini_set('error_log', 'php_err.log') ;
BlindeKinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h45.


 
 
 
 
Partenaires

Hébergement Web