Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PHP] Script qui s'arrete sans raisons

    1 juillet 2020 à 10:34:57

    Bonjour,

    j’ai un problème avec mon script php.

    En effet, à chaque fois que je le lance il s’arrête sans raison apparente au bout d’une quarantaine de minutes.

    J’ai d’abord pensé que c’était la boucle foreach qui crashait car elle durait trop longtemps alors j’ai divisé mon Array en 4 pour exécuter 4 boucles plus courte mais toujours le même problème.

    La boucle fonctionne très bien jusqu'au la 1505ème tour. Elle devrait normalement en faire 1584.

    J'ai pourtant utilisé ini_set ('max_execution_time', 0) pour enlever la limite de temps d'exécution mais ça n'a rien changé.

    Auriez vous peut-être une idée d'où vient le problème et comment le corriger ?

    Toutes mes recherches sur internet ne m'ont mené nulle part.

    $t_ga = $gaArray;
    $taille=count($t_ga);
    echo $taille;
    $t_ga1=array_chunk($t_ga, ($taille/4))[0];
    $t_ga2=array_chunk($t_ga, ($taille/4))[1];
    $t_ga3=array_chunk($t_ga, ($taille/4))[2];
    $t_ga4=array_chunk($t_ga, ($taille/4))[3];
    
    
    
    listage1($t_ga1);
    listage1($t_ga2);
    listage1($t_ga3);
    listage1($t_ga4);



    la fonction:

    function listage1($liste)
    {   
        include('../includes/configParsing2020.php');
    
            foreach ($liste as $ga) {
                
                for ($gp=1;$gp<=99;$gp++)
                {   
                    $id=$ga.add_zero($gp);
                    $id=str_replace('/n/r','',$id);             
                    //choix de l'URL de la page à parser
                    $url="MON URL:?pdpId=".$id; //je n'ai pas mis le vrai URL que j'utilise mais je pense pas que le problème vienne de l'URL
                    $handle =  curl_init($url);
                    
                    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
                    curl_setopt($handle, CURLOPT_HEADER, TRUE);
                    curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
                    curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
                    
                    $response = curl_exec($handle);
    
                    /* Check for 404 (file not found). */
                    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
                    curl_close($handle);
                                
                    if($httpCode == 200){       //vérificatoin que la page existe
                        $html="";   
                        $fonction = exec("C:\Users\Administrateur\AppData\Local\Programs\Python\Python38-32\python.exe parsing.py ".$url  ); // execution du programme en python pour récupérer le code source de la page
                        echo "fct: &nbsp".$fonction."&nbsp";
                    
                        $fichierSource= "codeSource.txt";//On ouvre le fichier texte qui contient le code source de la page web 
                    
                        /////////////ça plante ici au bout de la 1505ème éxécution/////////////////////////////////
                        $html=file_get_html($fichierSource); //je récupeère le code html de la page
                        while(html==""){
                            $html=file_get_html($fichierSource); //je récupeère le code html de la page
                        }
                        echo "ici 7 &nbsp";
                        $titreP1=$html->find('section h1');//on cherche le titre avec une balise h1 dans la page html
                                        
                        if (count($titreP1)>0){ 
                                //ici
                                $titreP1=@$titreP1[0]->innertext;
                                $test_syntaxe='#\([1-9][0]([0-9]){4}\)$#';
                                $test_syntaxe1='#\([1-9][0]\.([0-9]){4}\)$#';
                                $test_syntaxe2='#\([1-9][0]\.([0-9]){4}/[1-9][5]\.([0-9]){4}\)$#'; // (70.6030/95.4012)
                                if(preg_match($test_syntaxe,$titreP1)){
                                $titreP1=substr($titreP1,0,-9);}// ajouter test si il existe
                                if(preg_match($test_syntaxe1,$titreP1)){
                                $titreP1=substr($titreP1,0,-10);}// ajouter test si il existe
                                if(preg_match($test_syntaxe2,$titreP1)){
                                $titreP1=substr($titreP1,0,-18);}// ajouter test si il existe*/
    
                                $titreP1=explode("</span>",$titreP1);//séparation en deux à partir de la fin de la balise span 
                                $designation_p1=$titreP1[0];
                                $designation_p2=$titreP1[1];
                                $designation_p1=str_replace('<span class="title">',"",$designation_p1); // suppresion d'une partie de la chaine pour ne garder que le texte et enlever le html
                            
                                if($designation_p1=="" && $designation_p2=="") //si les désignations  sont vides
                                {
                                    echo "<br>pas de titre<br>";
                                }
                                else
                                {
                                
                                    $query = mysqli_prepare($bd, "INSERT INTO gp SET id = ? ,designation_p1= ?,designation_p2= ?,date_ajout=NOW() ON DUPLICATE KEY UPDATE designation_p1= ?,designation_p2= ?,date_maj=NOW(),statut='1'");
                                    mysqli_stmt_bind_param($query,'dssss',$id,$designation_p1,$designation_p2,$designation_p1,$designation_p2);
                                
                                    $res = mysqli_stmt_execute($query) or die(mysqli_error($bd));
                                    
                                    echo "<br>OK<br>";
                                }
                            
                            
                            
                            
                        }
                        else{
                            echo "<br>NOK<br>";
                        }
                        //vider le fichier contenant le code source:
                    unlink( $fichierSource );//supression du fichier
                    //sleep(1);
                    file_put_contents( $fichierSource, "");//création du fichier
                    
    
                    }
                }
            }
    
    
    


    -
    Edité par RemyMarius 1 juillet 2020 à 10:36:20

    • Partager sur Facebook
    • Partager sur Twitter
      1 juillet 2020 à 11:28:25

      > à chaque fois que je le lance il s’arrête sans raison apparente au bout d’une quarantaine de minutes

      40 minutes ?!? Tu ne l'exécutes quand même pas via ton navigateur mais bien en CLI ?

      Les erreurs PHP sont bien toutes activées et affichées ?

      PS : on ne prépare jamais une requête dans une boucle mais avant celle-ci

      -
      Edité par julp 1 juillet 2020 à 11:29:42

      • Partager sur Facebook
      • Partager sur Twitter
        1 juillet 2020 à 11:42:20

        Je l'éxectute pas en CLI mais en arrière plan grâce à une procédure ajax.

        oui les erreurs PHP sont activées.

        Très bien, merci, je prends note pour la place de la requête

        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2020 à 12:02:33

          > en arrière plan grâce à une procédure ajax

          Ca reste en HTTP et je suppose que bien que les erreurs soient activées et affichées si tu es en ajax, tu ne les as/récupères pas, correct ? Tu as regardé tes logs ?

          Tu demandes 2 fois la page ? Une en PHP puis une via Python ?

          Ta boucle ligne 35 est douteuse, c'est un truc à boucle infinie et est-ce que 2 appels à cette fonction pour la même entrée peut véritablement donner plusieurs résultats différents ?

          -
          Edité par julp 1 juillet 2020 à 12:07:41

          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2020 à 13:32:31

            julp a écrit:

            >Ca reste en HTTP et je suppose que bien que les erreurs soient activées et affichées si tu es en ajax, tu ne les as/récupères pas, correct ? Tu as regardé tes logs ?

            lorsque je fais des erreurs de syntaxes ou ce genre de choses elles me sont rapportées en tous cas donc ça devrait aussi m'afficher une erreur s'il y en avait eu une non ?

            je n'ai aucune erreur dans la console

            > Tu demandes 2 fois la page ? Une en PHP puis une via Python ?

            Mon script en pyhton récupère le code source et le place dans un fichier texte.

            Le PHP lui va transformé ce texte en un certain format pour pouvoir l'exploiter et retrouver des éléments html comme les titres etc..

            -
            Edité par julp il y a 13 minutes



            -
            Edité par RemyMarius 1 juillet 2020 à 13:34:57

            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2020 à 13:44:28

              Bonjour,

              Je ne sais pas trop ce que tu veux faire sur le plan fonctionnel - non technique - ... mais avoir pour mettre en oeuvre une solution qui repose sur un traitement en mode web (http) et non CLI  qui dure 40 minutes voire plus, qui empile du python et du php me semble pour le moins une architecture logicielle mal conçue.

              - si tu as besoin d'avoir des informations qui soient mises à jour "en temps réel" dans une page web, il y a des protocoles spécifiques : sse, websocket, mercure, etc,

              - un traitement fait en python peut se faire en général (pour ne pas dire toujours) en php ... pourquoi mixer ?

              Tu pourrais en dire plus sur le besoin ... fonctionnel ?

              A+

              • Partager sur Facebook
              • Partager sur Twitter
                2 juillet 2020 à 16:33:40

                Ce que je cherche à faire, c'est à récupérer le titre h1 d'une page web via son URL et de le placer dans une base de donnée. j'ai déjà essayé des méthodes PHP notament avec php simple html dom parser mais impossible de récupérer le code source de la page souhaitée. ça fonctionnait très bien sur d'autres sites mais pas celui que je veux.

                J'ai donc dû utiliser un script python qui récupère le code source et le place dans un fichier texte et avec html simple dom parser je récupère le titre.

                Je sais que du coup ça ralenti fortement l'éxécution mais je n'ai pas trouvé comment faire autrement.

                -
                Edité par RemyMarius 2 juillet 2020 à 16:34:08

                • Partager sur Facebook
                • Partager sur Twitter
                  2 juillet 2020 à 17:11:59

                  Par rapport à ce genre de besoin, en général :

                  1) on récupère en php le code source soit avec un file_get_contents soit avec cURL. Tu sembles utiliser cURL alors pourquoi un script python ?

                  2) Le code source récupéré, il faut effectivement le parser : je dois dire que trouver le titre dans un page me semble assez simple sans utiliser de bibliothèque de type parser.

                  ==> pourquoi fais-tu une boucle sur le cURL ?

                  ==> et ceci n'explique pas pourquoi ton script dure 40 minutes ? car en général la récupération d'une page et son parsing c'est quelques secondes.

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 juillet 2020 à 9:40:05

                    Bonjour

                    Le script dure aussi longtemps car j'ai un grand nombre de page à parser: plus de 2000? ce qui explique aussi la boucle car la seule chose qui différencie ces pages. 

                    EDIT: Je viens de réessayer de récupérer le code source avec cURL mais ça ne fonctionne pas sur le site visé. j'ai essayé sur d'autres site et ça fonctionne parfaitement. mais le site dont j'ai besoin ça ne fonctionne pas..

                    Utiliser un scripte extérieur et pas en PHP est la seule solution que j'ai trouvé pour récupérer le code source

                    Merci pour le temps que vous prenez à m'aider!

                    -
                    Edité par RemyMarius 3 juillet 2020 à 11:44:46

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 juillet 2020 à 11:21:20

                      Bigre 2000 pages ! tu ne nous dis pas tout car cela correspond presque à aspirer un site. Et juste pour avoir le titre de chaque page ?

                      A noter aussi que si j'étais le site parsé (un seul site ?) je te bloquerai ton adresse IP car 2000 appels c'est presque du "Force brut". Ceci pourrait-il correspondre à ton blocage ?

                      A+

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juillet 2020 à 14:25:32

                        oui, c'est un seul site.

                        En gros je suis stagiaire dans une entreprise et pour mette à jour les produits d'un de nos site on se sert des produits d'un autre des site de entreprise mais qui est géré par une autre agence. Du coup on utilise le parsing depuis plusieurs années. Mais le site sur lequel nous parsons les pages subit une grosse mise à jour et le système de parsing actuel ne fonctionne plus. 

                        Voilà la situation. 

                        pour le bloquage d'IP je ne suis pas sur, car j'ai essayé sur l'ancien site et ça a planté aussi..


                        je vais essayer de trouver un moyen d’optimiser au mieux le code 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 juillet 2020 à 15:22:43

                          Salut,

                          On en a vu des méthodes archaïque, mais là.. Pour ton souci tu peux effectivement tout faire en python ou tout en php, mais mixer les deux, c'est un peu bancale, quoique ca ne soit pas vraiment la source de ton problème, mais bon..

                          Est-ce qu'il est possible que tu nous montres exactement ce que tu souhaites récupérer ? À mon avis se peut se régler assez simplement et surtout ca doit pouvoir s'optimiser sans avoir un truc qui tourne 40 minutes.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 juillet 2020 à 18:29:56

                            Sans en savoir plus moi j'abandonne car cela ne me semble pas clair ... je ne vois pas trop pourquoi cURL ne fonctionne pas sur une site dont selon ta description vous êtes partenaires.

                            Empiler php et python est pour moi une hérésie : dis ci-dessus et renforcé par xoxotf.

                            Quand à dire que cela plante ... c'est quoi les messages d'erreurs ? logs ?

                            Petite solution dirty : au lieu de mettre à jour 2.000 pages d'un seul coup peut-être y aller par 500 ? 

                            Mais de base la solution est mauvaise.

                            Bye

                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 juillet 2020 à 18:49:12

                              Monkey3D:

                              je ne Comprend pas non plus que cURL ne marche pas sur le site en question alors que ça fonctionne sur des tas d’autres.. j’ai cherché longtemps sur internet etc mais il ne me renvoie casiment rien du code sourde de la page.. Je ne peux pas t’en dire d’avantage car même moi je n’en sais pas plus

                              c’est une assez grande entreprise et le site que je veux parser est le site officiel, le site de l’entreprise en général . Les informations serviront à remplire le site de la filiale française, un site beaucoup plus local. Nous n’avons ni accès au code du site officiel ni a sa base de donnée.C’est pour cela  qu’on utilise le parsing. 

                              je n’ai aucun message d’erreur meme pas dans la console

                              En tous cas merci du temps que tu as pris pour m’aider ! 

                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 juillet 2020 à 22:43:53

                                Ca reste discutable les choix de ton entreprise, non ? Vous maintenez un code de "bidouille" parce que le parsing de page web, ca marche un jour ca casse le lendemain.. Il te paye à maintenir ca au lieu de faire les choses correctement ??

                                Et pour l'histoire avec cURL, certains sites refuse certains user-agent (qui est fournis dans le header de ta requête) ca pourrait être une piste, parmi d'autres.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 juillet 2020 à 0:02:13

                                  J'ai du mal à comprendre comment au lieu de creuser et de chercher pourquoi curl "ne marchait pas", vous êtes tout bonnement partis sur un autre langage comme "solution".

                                  Bref, en comparant les requêtes et les réponses HTTP entre PHP et Python, il n'y a pas moyen de déterminer ce qui pourrait différer et jouer ? (parce que là, tu parses deux fois la page et celui en Python, ça finit en fichiers temporaires au lieu de rester en mémoire, correct ? Donc en se passant de Python, le temps d'exécution pourrait être diminué de théoriquement moitié - sans doute plus ?)

                                  PS : une requête préparée, ça ne se prépare jamais dans une boucle mais avant. On ne fait que l'exécution dans la boucle. Voir aussi les fonctions multi de cURL pour paralléliser les requêtes HTTP

                                  -
                                  Edité par julp 6 juillet 2020 à 0:05:22

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 juillet 2020 à 8:36:51

                                    xoxotf:

                                    Salut, qu'est ce que tu appelles "faire les choses correctement? Prendre les informations directement depuis la bdd du site au lieu de le parser ?(parce qu'on n'y a pas accès..)

                                    julp:

                                    Salut, j'ai passé beaucoup de temps à essayer avec cURL mais sans succès. j'ai aussi utilisé file_get_contents mais ça n'a pas marché non plus. J'ai cherché sur plein de forums mais je n'ai rien trouvé.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 juillet 2020 à 19:48:05

                                      RemyMarius a écrit:

                                      xoxotf:

                                      Salut, qu'est ce que tu appelles "faire les choses correctement? Prendre les informations directement depuis la bdd du site au lieu de le parser ?(parce qu'on n'y a pas accès..)

                                      Salut,

                                      Dans ton explication, tu nous dis que le site que tu parses fait partie d'une branche de votre société, mais que c'est gérer par une autre entité, en gros ? J'imagine que vous avez déjà demandé, mais pourquoi on vous refuserait l'accès a des données que vous utilisez pour travailler ? Surtout si vous faites parties du même groupe, ca n'a pas de sens, et même si on vous refuse l'accès à une BDD, pourquoi ne pas vous fournir une API qui vous fournis uniquement les données nécessaires ? C'est juste contre-productif à mes yeux..

                                      Pour en revenir au problème, je veux bien aider, mais il faudrait qu'on sache sur quoi tu fais tes requêtes, et ce, dont tu as besoins de parser, à l'aveugle, c'est compliquer d'aider.

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      [PHP] Script qui s'arrete sans raisons

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown