Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 14/06/2011, 11h33   #1
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
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 :
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.
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 11h36   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
fait set_time_limit(0) au début de ton code
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 13h50   #3
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
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.
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h16   #4
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
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 !
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h18   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/06/2011, 11h35   #6
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
J'utilise une classe que j'ai repris d'internet. Mais est-il possible de pallier à ce problème avec un memory_limit ?
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h09   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Hello

Code :
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h49   #8
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
excuse moi de mon ignorance. Quand tu parles de thread.. qu'est ce que tu veux dire par là ?
Par exemple :
generationPdf.php
Code :
1
2
3
4
5
 
function creation_pdf($parametre)
{
  // code de generation
}
script principal :
Code :
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.
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h54   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/06/2011, 16h10   #10
Invité de passage
 
Inscription : mars 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 46
Points : 4
Points : 4
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 !
breizhlama est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 16h13   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Pas de quoi

Pour bien débuter avec Ajax regarde du coté de jQuery:
- http://javascript.developpez.com/cou...meworks#jquery
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre 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 05h09.


 
 
 
 
Partenaires

Hébergement Web