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 :

[FTP] Envois de fichiers trop encombrants


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [FTP] Envois de fichiers trop encombrants
    Bonjour à tous,

    Lors de la création d'un script php forçant le téléchargement d'un fichier, je rencontre un problème empêchant le script de fonctionner...

    Je m'explique:
    nous disposons de 3 serveurs - 2 dédiés (xy et xz) hébergeant les fichiers et un mutualisé (ddl). Le script forçant le téléchargement se trouve sur ddl.

    La première partie se passe bien mais au cours du téléchargement un problème arrête le téléchargement...

    Les hypothèses avancées étant:
    1)timeout (temps d'exécution maximale du script sur ddl 18 secondes)
    2)taille mémoire excessive (la taille mémoire allouée par script est de 6 mo)

    Cependant aucune des 2 hypothèses n'est à mon avis réaliste car si l'on essaye de télécharger le fichier en limitant le débit à 1ko/s ou 10ko/s le temps de 18 secondes peut être amplement dépassé.

    voici le script
    <?php
    function url_exists($url)
    {
    $handle = @fopen($url, "r");
    if ($handle === false)
    return false;
    fclose($handle);
    return true;
    }
    $server="localhost";
    $user="user";
    $pass="pass";
    $base="base";

    $link=@mysql_connect($server,$user,$pass)
    or die("Connexion impossible".mysql_error ());
    @mysql_select_db($base)
    or die("impossible d'accéder à $base");
    $id=$_GET['did'];
    $sql= 'SELECT durl1,durl,dfilesize FROM `downloads` WHERE did="'.$id.'"';
    $req = mysql_query($sql)
    or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    $data = mysql_fetch_array($req);
    $fichier = $data['durl1'];
    $filename=$data['durl'];
    $len=$data['dfilesize'];
    mysql_free_result ($req);
    mysql_close ();
    if (url_exists($fichier)) {
    header("Content-disposition: attachment; filename=$filename");
    header('Content-Description: File Transfer');
    header('Content-Type: application/force-download');
    header("Content-Length: $len");
    readfile($fichier);
    }
    else {
    echo "Erreur 404";
    }
    ?>
    Petite précision
    1)les fichiers pèsent entre 160mo et 180mo
    2)il ne s'agit nullement de warez...(les fichiers sont libres)
    3)les fonctions permétants de restter le watchdog de php sont désactivées.
    4)aucune mention d'erreur n'est faite sur la sortie standard

    La question étant : y a il un moyen simple pour
    1)connaitre précisément le problème
    2)le résoudre

    Merci d'avance

    ++

    PS: j'espère ne pas avoir enfreint trop de règles lors de mon premier post

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    tu devrais utiliser les balises code (symbole #) pour ton message a la place des balises citations, c'est plus propre ;o)

    Il n'y a pas que le temps d'execution du script, il y a aussi le temps max d'execution apache par exemple qui est a 300 secondes par defaut je crois. Tu devrais chronometrer le timeout et changer le débit pour savoir si c'est une limitation de timeout ou de taille mémoire (si timeout en meme temps alors que débit différent : probleme timeout, sinon probleme taille mémoire)

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Vous avez jeter un oiel aux logs d'apache et de php ? Il doit y avoir quelque chose à l'intérieur si le problème provient de l'un d'eux.

    Sinon tu peux ajouter

    error_reporting(E_ALL);
    En début de script pour être certain qu'aucune erreur n'est générée.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Un grand merci pour les précieuses informations;-)

    il s'agit d'un problème de mémoire...

    Est ce qu'il y a un moyen de passer outre? de limiter la mémoire pour l'inscruction readfile?

    @+

  5. #5
    Membre régulier
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 86
    Points
    86
    Par défaut
    Si readfile est trop gourmand en mémoire, tu peux peut-être essayer de lire ton fichier par petit bout avec fread (j'ai pas testé) ? Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $file = fopen('...', 'rb');
    while (!feof($file)) {
     $buf = fread($file, $buf_length); // $buf_length en octect
     echo $buf;
    }
    fclose($file);

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour l'astuce mais sa fonctionne pas... là c'est php qui me jette en me disant que le temps est dépasé
    (j'ai dû ouvrir le fichier avec notepad++ pour le voir....)

    @+
    bonne soirée

  7. #7
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    jette un oeil du coté de max_execution_time dans le php.ini, et éventuellement du coté de max_file_size

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Ajoute set_time_limit(0); en début de script. Ca devrait aller tout seul.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Bon on a essayé ton idée Epox et on obtient ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: set_time_limit() has been disabled for security reasons in download3.php on line 3
    Et pour les modifications dans le php.ini, nous n'avons pas accès au config du serveurs.

    Donc, a moins que vous trouviez une solution miracle ca semble un peu mort

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Petite précision au poste précédent...

    Toutes les fonctions altérant les paramètres de php.ini ainsi que le watchdog de php ont été désactivées sur ce serveur -->online.net sauf erreur ...

    Bonne nuit @tous

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    argh.... effectivement sa sent le sapin ct histoire :/

    Vous avez essayé de modifier la taille de la mémoire alloué à php ? -> ini_set("memory_limit","200M");

    http://fr3.php.net/manual/fr/ini.cor...i.memory-limit

    Sinon il faudrais peut être essayer d'augmenter la taille du buffer lors de la lecture pour rendre la lecture plus rapide.

  12. #12
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Mon avis perso : pour des fichiers de 160 ou 180 Mo, http n'est peut être pas le protocole le mieux adapté (la preuve ...)
    En plus des problèmes que tu peux rencontrer avec ton serveur (qui n'est pas vraiment fait pour ça), ce n'est pas super confortable pour l'utilisateur de télécharger des fichiers aussi gros avec un simple navigateur web (pas de possibilité de mettre en pause ou en arriere-plan, et en cas de bug au bout de 150mo, il faut tout recommencer depuis le début ... ).
    C'est pas pour rien si FTP a été inventé ...
    Après, je ne sais pas quels sont les besoins de ton appli, mais ce que je sais c'est qu'on a plus souvent interêt à utiliser les outils les plus adaptés, ça évite bien des problèmes du genre de ceux que tu es en train de rencontrer.
    C'était mon avis perso, tu en fais ce que tu veux ...

  13. #13
    Membre régulier
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 86
    Points
    86
    Par défaut
    Il te reste toujours la possibilité de faire un lien direct sur le fichier à télécharger, ou un lien vers un fichier qui te redirige via un header('Location : xxx') sur le fichier à télécharger (histoire de masquer le chemin du fichier à télécharger - pas testé non plus)

    Sinon, après quelques recherches, l'histoire de découper la lecture via fread (cf. un peu plus haut) semble fonctionner pour les problèmes de mémoire.
    C'est ce qu'ils conseillent dans les commentaires de la doc de php

Discussions similaires

  1. [FTP] Envoi de fichier ZIP
    Par Arbisis dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2008, 23h46
  2. [FTP] Envoi de fichiers
    Par gasper06 dans le forum Langage
    Réponses: 4
    Dernier message: 27/01/2008, 22h07
  3. [FTP] Envois de fichiers trop encombrants
    Par baby-tux dans le forum Langage
    Réponses: 12
    Dernier message: 08/09/2006, 14h07
  4. Envoi de fichier sur un serveur FTP
    Par pepe2006 dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 10h19
  5. [C#] [FTP] Envoi et suppression fichier sur ftp NON ANONYME!
    Par djsbens dans le forum Windows Forms
    Réponses: 14
    Dernier message: 30/03/2005, 10h20

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