IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

téléchargement par readfile() ne fonctionne plus


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Invité
    Invité(e)
    Par défaut


    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    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()

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    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:
    [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...

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    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 : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    chez moi c'est /var/log/php/error.log sinon tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print_r(ini_get('error_log') );

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    aucun résultat avec fread():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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'...

  8. #8
    Invité
    Invité(e)
    Par défaut
    "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 ).

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 119
    Points : 81
    Points
    81
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Premature end of script headers: download.php
    Je n'arrive pas à avoir les erreurs php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error_reporting(E_ALL);
    ini_set('error_log', 'php_err.log') ;

Discussions similaires

  1. Classement par ordre alphabétique ne fonctionne plus
    Par Alixam dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 07/08/2012, 15h51
  2. Suppression de module par du VB ne fonctionne plus!
    Par a.floranc dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2011, 21h08
  3. Réponses: 5
    Dernier message: 08/07/2011, 09h56
  4. Archivage par touche ALT+Z ne fonctionne plus
    Par OOKAMIFR dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 02/03/2011, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo