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 :

Fatal error: Maximum execution time of 30 seconds exceeded


Sujet :

Langage PHP

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Points : 276
    Points
    276
    Par défaut Fatal error: Maximum execution time of 30 seconds exceeded
    Bonjour,
    Dans mon code, j'ai toujours ce message qui s'affiche "Fatal error: Maximum execution time of 30 seconds exceeded in ...".
    Le seul problème est que ce message n'est jamais localisé au même endroit dans mes fichiers.
    J'ai remarqué que ce message arrivait environ au bout de 183000 ms (un peu plus de 3 minutes).
    Je n'arrive pas à savoir d'ou vient le problème.

    Pour information, voici ce que je fait:
    Je cherche a vérifier et à mettre à jour un référentiel pour une application.
    je récupère le référentiel (5450 lignes comportants 3 informations chacune + 317 ligne comportant 1 ou 3 informations).
    Chacune des information est vérifiée à partir du référentiel de l'entreprise. Pour chacune des vérifications, j'ouvre et je ferme la connection à la base de données.

    D'ou vient mon problème?

    cordialement,
    vandman

  2. #2
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Bonjour,

    le temps d’exécution de ton script est trop long, tu peux utiliser set_time_limit() pour éviter ce genre de souci (http://php.net/manual/fr/function.set-time-limit.php)

    Sinon, pourquoi fermer ou ouvrir la connexion BDD à chaque fois ?

  3. #3
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Points : 276
    Points
    276
    Par défaut
    Bonjour,
    Merci pour la réponse, j'avais déjà appliqué cette méthode.
    Dans une de mes boucles, j'ai fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ($array_GroupeCodeAdm['groupe_codes'] as $cle => $champ) {
     set_time_limit(30);
    ...
    }
    J'ai la sensation que ce n'est pas bon, mais ca fonctionne???
    Par contre, je ne comprends toujours pas, car je suis largement au dessus des 30 secondes. Pourquoi attendre plus de 3 minutes pour me dire que ma requette est longue?
    Cordialement,

    Vandman

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le set_time_limit() se met evidemment une seule fois en début de script.
    Sinon il suffit de lire la documentation :
    Lorsqu'elle est appelée, set_time_limit() remet le compteur à zéro. En d'autres termes, si la limite par défaut est à 30 secondes, et qu'après 25 secondes d'exécution du script l'appel set_time_limit(20) est fait, alors le script tournera pendant un total de 45 secondes avant de finir.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Pour compléter la réponse de sab' et la doc : si tu appelles set_time_limit dans une boucle, tu remets le compteur à 0 à chaque tour de boucle, mais l'erreur ne prend en compte que le dernier appel pour faire l'affichage du message d'erreur.

    Et évidemment, ça pourrait être une bonne idée d'essayer d'optimiser un peu ton script si c'est possible

  6. #6
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Pour chacune des vérifications, j'ouvre et je ferme la connection à la base de données.
    Est-ce nécessaire ? Car c'est potentiellement ça qui prend du temps. Ouvre la connexion au début du traitement et après avoir terminé tes vérifications

  7. #7
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Points : 276
    Points
    276
    Par défaut
    Bonjour et merci pour vos réponses.
    Pour ce qui est de l'optimisation de mon code, c'est assez complexe.
    la structuration des données est la suivante:
    un code ca avance => cc/df/act (code1 cc, code2 df, code3 act)
    un code ca recette => cp/df/act (code1 cp, code2 df, code3 act)
    un code cb avance => cf
    un code cb recette => cbud/cf/fd (code1 cbud, code2 cf, code3 fd)

    En plus de la structuration précédente, il faut savoir qu'a un code ca avance, correspond un code cb avance. il en va de même pour la recette.
    J'ai 10 groupes de codes ca vance, cb avance.
    cas 1: Je cherche à mettre à jour 1 code ca ou cb dans un groupe de code ca vance, cb avance.
    cas 2: Je cherche à mettre à jour tous les code d'un groupes de codes ca vance, cb avance.
    cas 3: Je cherche à mettre à jour tous les codes de tous les groupes de codes ca vance, cb avance (10).

    Pour chacun de ces éléments (codes), j'ai créé des class, des class héritées, des interfaces et des fonctions spécifiques de recherche dans une base postgres pour chaque code.
    Chaque requette est organisée de la façon suivante:
    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
    function SqlCa_code_a ($data) {
     
    	$SqlQuerry = '';
    	$SqlWhere = 'WHERE ca.suppr = 0 ';
    	$Param = array();
    	if (is_int($id_gcode)) {
    		$SqlWhere .= ' AND ca.id_groupe = :id_groupe ';
    		$Param[':id_groupe'] = $id_gcode;
    	}
    	$SqlQuerry .= ' SELECT ca.code,ca.intitule_code ';
    	$SqlQuerry .= ' FROM table_ca ca ';
    	$SqlQuerry .= $SqlWhere;
    	try {
    		$db = new PDO(DB_DSN, DB_USER, DB_PASSWORD);
    		$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    		$Qry = $db->prepare($SqlQuerry);
    		$Qry->execute($Param);
    		$Result = $Qry->fetchAll();
    		$rows = $Qry->rowCount();
    		$Qry->closeCursor();
    		return ['nb_ligne' => $rows,
    				'ca_codes' => $Result];
    	} catch (PDOException $e) {
    	    echo "Echec de la connexion : " . $e->getMessage();
    	    exit;
    	}
    }
    Je ne sais pas trop comment optimiser le code?
    Cordialement,
    Vandman

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ben déjà, comme l'a indiqué Rpass, tu peux commencer par mutualiser la connexion à la base. Par exemple : tu l'ouvres une fois au début du script et tu la passes en paramètre à tes fonctions de recherche.
    Ensuite, est-ce que tu as des requêtes de modification et/ou création multiples ? Si c'est le cas, est-ce que tu exploites les réquêtes préparées au mieux ?

    Regarde aussi la volumétrie de tes résultats : fetchAll est une fonction bien pratique, mais en fonction de la quantité de données récupérées et ce que tu en fais ensuite, ça peut être moins couteux de travailler en boucle fetch.

Discussions similaires

  1. Wamp - Fatal error: Maximum execution time of 300 seconds
    Par sam soul dans le forum Débuter
    Réponses: 19
    Dernier message: 26/11/2013, 22h07
  2. [Wamp] Erreur instantannée -> Fatal error: Maximum execution time of 30 seconds exceeded
    Par Villon dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 05/12/2012, 10h56
  3. Fatal error: Maximum execution time of 30 seconds exceeded
    Par dubitoph dans le forum Doctrine2
    Réponses: 5
    Dernier message: 19/12/2011, 08h47
  4. Réponses: 4
    Dernier message: 21/07/2006, 15h33

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