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

PHP & Base de données Discussion :

Problème max_execution_time script PHP


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut Problème max_execution_time script PHP
    Bonjour,
    Actuellement je travail sur un script d'extraction d'information de la base de données vers un fichier de type pdf. Ce script a pour bug de générer une centaine voir 200 pdf pendant son exécution sauf que je rencontre un problème qui me semble venir du max_execution_time. Puisque mon script ne se finit pas, et s'arrête au bout de 30 seconde, valeur par défaut dans le phpinfo.
    Je sais qu'il faut modifier le fichier php.ini, mais malheureusement j'ai pas accès au paramètre du serveur web. J'ai essayé de mettre un init_set... mais ça semble ne pas fonctionner. connaitriez-vous une autre méthode ?

    Voici mon script :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php
     
    require('phpToPDF.php');
    require('MysqlTable.php');
     
    class PDF extends PDF_MySQL_Table
    {
    function Header()
    {
        //Titre
        $this->SetFont('Arial','',18);
     
    	$this->Cell(0,6,'Information DA',0,1,'C');
     
        $this->Ln(10);
        //Imprime l'en-tête du tableau si nécessaire
        parent::Header();
    }
    }
     
    //Connexion à la base
    mysql_connect("%%%%", "%%%%","%%%%");
    mysql_select_db("%%%%");
     
     
    $req1 = mysql_query("SELECT distinct cost_center FROM `data_txt` where cost_center like 'F1S%' limit 400");
    $nb_result = mysql_num_rows($req1); 
    echo $nb_result;
    $compteur = 0;
    while ($section = mysql_fetch_array($req1)) 
    {
    set_time_limit();
    $compteur++;
    echo "$compteur</br>";
    echo $section['cost_center']."</br>";
    $pdf=new PDF();
    //création d'une nouvel page
    $pdf->AddPage();
     
    $pdf->Text(80,20,"Section ".$section['cost_center']."");
     
     
    //Insertion de l'image selon le type de pdf voulu
     
    	$pdf->Image("http://university.fr/reporting/outilSuiviDA/imgdata_graph.php?section=".$section['cost_center']."&request=$request",10,30,200,100,"PNG");
     
    // Positionnement du curseur pour insérer le tableau
    $pdf->SetX(10);
    $pdf->SetY(150);
    //Requete permettant de sortir les tableaux avec les résultat
     
    	$sqlrequest ="SELECT RIGHT(LEFT(`start_date`,7),2) AS Mois,
    ROUND(SUM(item_total_cost),2) AS 'TOTAL Facturé + Engagé',
    ROUND(SUM(case when  course_number_1 LIKE 'EC%' 
    AND course_number_2 NOT LIKE 'DIF%'  
    then item_total_cost else 0 end),2) AS 'ECM',
    ROUND(SUM(case when course_number_2 LIKE 'DIF%' 
    then item_total_cost else 0 end),2) as 'TOTAL DIF' 
    FROM data_txt WHERE company='FR-CIT FRANCE' 
    AND (order_status='Confirmed' OR order_status='Delivered') AND cost_center ='".$section['cost_center']."' 
    GROUP BY RIGHT(LEFT(`start_date`,7),2)";
     
    $sqlrequestTotal="SELECT '2011' as 'Année',ROUND(SUM(item_total_cost),2) AS 'TOTAL Facturé + Engagé (EUROS)',
    ROUND(SUM(case when  course_number_1 LIKE 'EC%' 
    AND course_number_2 NOT LIKE 'DIF%'  
    then item_total_cost else 0 end),2) AS 'ECM (EUROS)',
    ROUND(SUM(case when course_number_2 LIKE 'DIF%' 
    then item_total_cost else 0 end),2) as 'TOTAL DIF (EUROS)' 
    FROM data_txt WHERE company='FR-CIT FRANCE' 
    AND (order_status='Confirmed' OR order_status='Delivered') AND cost_center ='".$section['cost_center']."' ;";
     
    //Création des tableaux depuis les requêtes SQL
    $pdf->Table($sqlrequest);
     
    $pdf->Table($sqlrequestTotal);
    //Impression du document pdf dans la page
     
    $pdf->Output("./document/".$section['cost_center'],"F");
    }
    ?>
    Merci beaucoup.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    fait set_time_limit(0) au début de ton code

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    Merci pour ta réponse. ça fonctionne mieux. Mais le script s'arrête de façons aléatoires. Parfois il finit bien son travail. d'autres fois il fait même pas le 1/4.
    Je comprends vraiment pas.

  4. #4
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    après voir fait de nombreux test... le script finit des fois son travail, et des fois il s’arrête en plein milieu. C'est vraiment très aléatoire. Je ne comprend pas d'où peut venir le problème !

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par breizhlama Voir le message
    après voir fait de nombreux test... le script finit des fois son travail, et des fois il s’arrête en plein milieu. C'est vraiment très aléatoire. Je ne comprend pas d'où peut venir le problème !
    a mon avis ta classe PDF n'est pas très optimisé et prend beaucoup de ressource

  6. #6
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    J'utilise une classe que j'ai repris d'internet. Mais est-il possible de pallier à ce problème avec un memory_limit ?

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('memory_limit', -1);
    Tout ça n'est que de la bidouille, il vaudrait mieux pour toi de faire générer ces fichiers par des threads séparés ou par un daemon en mode CLI. Bref, ta logique de génération est à revoir.

  8. #8
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    excuse moi de mon ignorance. Quand tu parles de thread.. qu'est ce que tu veux dire par là ?
    Par exemple :
    generationPdf.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function creation_pdf($parametre)
    {
      // code de generation
    }
    script principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    require(generationPdf.php');
     
    //mise des numéro de section dans un tableau
    //boucle
    for($i=0,$i<$num_row,$i++)
    {
    creation_pdf($numsection[i])
    }
    J'ai surement mal compris, mais je voulais vérifier.

    Merci pour vos réponses.

  9. #9
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Pour faire simple, si la génération de tous les PDF d'un seul bloc est trop lourde au niveau mémoire / temps d'éxécution, il serait peut-être judicieux de paralléliser ces traitements de telle sorte que plusieurs processus (ou plusieurs threads - ou sous-processus si tu préfères - si tu peux installer l'extension PCNTL) se découpent la tâche.

    On peut également envisager de créér une pile de traitement (en BDD par exemple) avec un cronjob (une tâche réccurente lancée périodiquement par le serveur) qui toutes les X minutes effectueraient une partie des traitements.

    On peut aussi faire ça avec Ajax de telle sorte qu'on attende qu'un fichier (ou bloc) soit terminé pour demander la génération des fichiers (ou blocs) suivants. Ce qui permettrait au passage d'afficher une barre de chargement.

  10. #10
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    Merci pour ta réponse. Le seul choix qui me reste est donc l'ajax. Puisque avec PCNTL, il faut un environnement UNIX... dommage c'est hébergé sur un serveur windows. Ensuite pour cronjob, crontab et compagnie.... c'est pas possible non plus, le script est à destination d'un intranet, et cron tab faut avoir la main sur le serveur... ce que je n'ai pas. Je vais allez regarder du coté du Ajax, apprendre les principes, et faire ce que j'ai envie de faire.

    Merci beaucoup !

  11. #11
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Pas de quoi

    Pour bien débuter avec Ajax regarde du coté de jQuery:
    - http://javascript.developpez.com/cou...meworks#jquery

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème de script PHP sur Dolibarr
    Par bmael dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/02/2011, 12h58
  2. [MySQL] Problème de script PHP/MySQl V.2
    Par lukyVJ dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 20/12/2010, 13h06
  3. [MySQL] Problème de script PHP/MySQl
    Par lukyVJ dans le forum PHP & Base de données
    Réponses: 45
    Dernier message: 10/12/2010, 19h02
  4. [MySQL] Problème de Script Php
    Par breizhlama dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/03/2010, 14h24
  5. problème de script php pour revenir à la page précédente
    Par mandyben dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2006, 10h12

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