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 :

[Tableaux] Boucle trop longue entraîne arrêt de script


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut [Tableaux] Boucle trop longue entraîne arrêt de script
    Bonjour,

    Lorsque je lance ma page php, le script qui est une boucle de bourrin, finit par s'arrêter tout seul en plein milieu, sans message du type "fatal error - max execution time".

    Le principe :
    - stocker dans une variable php le code source d'une page html.
    - dire si le mot "programmation" est compris dans le code source de la page.
    - répéter ça 1001 fois.


    voici le code un peu simplifié :

    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
     
    //création du tableau de 1001 URL
    for ($i=0;$i<=1000;$i++){
    	$adresses[$i]= "http://www.developpez.net";
    }
     
    //affichage de l'adresse des 1001 URL chargées et réponse
    for ($i=0;$i<=1000;$i++){
    	$source = htmlspecialchars(file_get_contents($adresses[$i])) ;
    	if(ereg("programmation", $source)){
    		echo $i." ".$adresses[$i]." programmation est dans le code<br>";
    	}
    	else{
    		echo $i." ".$adresses[$i]." programmation n'est pas dans le code<br>";
    	}
    }
    Chez moi, la boucle s'arrete au niveau de la 500ème itération selon les cas.

    phpinfo() me donne 5000 sec en 'max_execution_time'

    J'ai tenté :
    - set_time_limit(0); au début ou à chaque itération
    - ini_set('max_execution_time', 0); en début de script

    Et malgré ça, le script s'arrête et je ne comprends pas bien pourquoi j'en arrive là!

    Merci d'avance pour votre aide !

    VonWolf

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Change 'ereg' en 'preg_match' c'est plus rapide .C'est sur que ton code est bourrin

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Utilise même carrément strstr() ou strpos() pour tester ... C'est n'importe quoi d'utiliser une regex pour un motif aussi simple

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Merci Mr[ben].

    Le preg_match est effectivement plus performant. Mais j'ai augmenté la longueur du tableau à 2000 lignes et la boucle plante quand même vers 1300.

    Quelqu'un comprend le mécanisme qui génère ce plantage et comment y remédier?

    Existe t il une méthode empêchant le serveur d'arrêter le flux d'information? Faut il passer par un php.ini inséré dans le même répertoire ?

    Merci!
    VonWolf

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Ou alors t'as regex tu fais en sorte qu'elle ne cherche qu'une seule fois le mot programmation .

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    ok, reprenons alors

    Sachant que tu as besoin de traiter un grand nombre de lignes il va falloir que tu le fasses en plusieurs fois, plutôt que de traiter des gros lots d'un coup.

    Tu prends le nombre max de recherches effectuées avant la limite.
    Tu divises ça par deux (principe d'ultra précaution ), et tu as le nombre maximum de recherche à effectuer par "tour".

    C'est le même principe que pour une mailing list, et pour toutes les tâches gourmandes automatisées.

    EDIT : j'oubliais, il faut éviter file_get_contents() et utiliser fopen() et fread(), qui sont plus rapides.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Merci de ton aide!

    Avec fopen et fread la boucle plante maintenant à 3700. Belle optimisation!

    Voici la modif avec fopen et fread pour ceux que ça intéresse(ra) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $handle = fopen("http://www.developpez.net", "rb");
    $contents = '';
    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
     
    echo htmlspecialchars($contents);
    où $contents contient la source de la page http://www.developpez.net

    il va falloir que tu le fasses en plusieurs fois, plutôt que de traiter des gros lots d'un coup.
    Qu'entends tu par ça? Est-ce une page pour les indices de 0 à 1000 du tableau, puis une autre avec les 1000 suivantes, etc ?
    Ou as tu une technique pour couper en plusieurs tours tout en lançant l'opération en une seule fois ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Je ne trouvais plus le bon terme, il s'agit d'un "traitement par lot" !

    Première solution, enfin après tu le gères un peu comme tu le sens ... avec des tâches planifiées, en ajax, des pages toutes simples avec un redirect (balise meta ou javascript) qui charge les url suivantes au bout de xxx secondes, etc ...

    Sinon pour fopen() et compagnie, effectivement dans ton cas c'est assez énorme. Mais comme tu passes par le réseau pour tes fopen(), suivant l'heure ça peut varier aussi ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut traitement par lot
    Pour le traitement par lot j'ai trouvé le bout de code suivant que je vais essayer d'exploiter. Il est apparemment à placer en fin de code avec un if dont la condition porte sur le nombre d'itérations effectuées par la boucle de bourrin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "<script language='javascript'>document.location.href='".$_SERVER['PHP_SELF']."';</script>";
    je vois ça ce soir..

    EDIT : Enfin dès que l'alim de mon PC sera réparée...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    N'oublies pas de transmettre justement le nombre auquel tu t'arrêtes, sinon tu vas recommencer sans cesse le même lot

Discussions similaires

  1. Ameliorer code : Boucle trop longue
    Par diego45 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/12/2014, 10h55
  2. Boucle trop longue
    Par Vivien57 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/05/2011, 08h49
  3. Réponses: 2
    Dernier message: 20/02/2008, 11h16
  4. [debutant] boucle trop longue?
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 16h17
  5. Réponses: 3
    Dernier message: 18/02/2006, 18h51

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