Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony4] Problème avec file_get_contents

Sujet résolu
    27 octobre 2019 à 10:09:14

    Bonjour à tous ! Je suis entrain de m’entraîner un peu sur Symfony 4 pour voir le potentiel énorme du framework, et je suis tombé sur un os.

    Voila, quand je fais un file_get_contents sur le serveur symfony, il me met cette erreur:

    Warning: file_get_contents(http://localhost:8000/api/server/1/key/1): failed to open stream: HTTP request failed!

    J'ai donc tenté de modifier la configuration du serveur php, en mettant:

    ; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
    ; http://php.net/allow-url-fopen
    allow_url_fopen = On
    
    ; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
    ; http://php.net/allow-url-include
    allow_url_include = On

    Mais rien à faire, je tombe toujours sur cette erreur, j'ai recherché sur internet, mais en vain, je n'ai rien trouvé qui a résolue mon problème.

    Je tiens à précisé que si je fais le même file_get_contents depuis un serveur WAMP (url: localhost), celui marche parfaitement (donc le bloquage s'effectue que sur symfony). J'ai peut être mal configuré quelque chose.

    En tous cas, j'aimerais bien régler cette erreur, donc merci d'avance à ceux qui me fourniront des réponses !

    • Partager sur Facebook
    • Partager sur Twitter

    Bien à vous, ph1823.

      27 octobre 2019 à 11:11:07

      Oui j'avais déjà trouver ceci sans succès, voila le code que j'ai actuellement :

      Pour la route "/api/server/{id}/key/{userID}":

          /**
           * Use for get hashkey to get console and stats
           * @Route("/key/{userID}", name="server_key")
           * @return JsonResponse
           */
          public function key($id, $userID)
          {
      
      
              //On vérifie que l'user à bien le serv
      
      
              /* On teste si le manager est on*/
              try {
                  $file=file_get_contents("http://localhost:9999/server/$id/key");
                  $hash=json_decode($file)->{"hash"};
                  return $this->json(["code" => 200, "hash" => $hash], 200);
              } catch (\Exception $e) {
                  return  $this->json(["code" => 500, "message" => "Connexion error"],500);
              }
      
          }

      et voici le code qui appel cette route avec le file_get_contents:

          /**
           * @Route("/panel/minecraft/{id}", name="minecraft_panel")
           */
          public function minecraft_panel($id)
          {
              set_time_limit(3000) ;
              ini_set('memory_limit', '-1');
              $options = array(
                  'http' => array(
                      'header'  =>  "Accept:application/json\r\n" .
                          "X-Requested-With:XMLHttpRequest\r\n",
                      'method'  => 'GET'
                  ),
              );
      
              $context=stream_context_create($options);
      
              $url =$this->generateUrl('server_key', ['id' => $id, 'userID' => $this->getUser()->getId()],UrlGeneratorInterface::ABSOLUTE_URL);
      
              $response="error";
      
              try {
                  $response =file_get_contents("http://localhost:8000/api/server/1/key/1", true, $context);
              } catch (\Exception $e) {
                  echo $e->getMessage();
              }
             // $hash = json_decode($response)->{"hash"};
      
              var_dump($response);
              return $this->render('panel/minecraft.html.twig', ['home' => true, 'id' => $id, 'hash' => "000", 'name' => "Minecraft Server", "ip" => "datahosting.fr"]);
          }

      Je ne pensais pas que le code soit utile, car il me semblait que c'était une erreur de configuration côté serveur ^^

      Merci de votre aide!


      • Partager sur Facebook
      • Partager sur Twitter

      Bien à vous, ph1823.

        27 octobre 2019 à 11:32:42

        Salut !

        Evite d'utiliser file_get_contents() avec un URL, qui plus est un URL local qu'il faudra(it) changer en passant en ligne. Utilise un chemin machine et regarde du côté du paramètre kernel.project_dir, c'est nettement plus portable et un tant soit peu prévu pour ce que tu fais — sauf si ce fichier est hébergé sur une autre application locale pour test tests, reste que je mettrais en paramètre l'URL plutôt que de la laisser en dur.

        -
        Edité par Ymox 27 octobre 2019 à 21:35:21

        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2019 à 11:44:49

          Je ne comprend pas trop pourquoi on utiliserai kernel.project_dir , je génère mon URL avec symfony, la je l'ai mis dur pour le test,si non c'est symfony qui va gérer la génération de l'URL.

          J'ai chercher du côté de kernel.project_dir pour l'utiliser, mais a ce que je vois ca renvoi juste le dossier du projet, hors moi je souhaite récupérer les informations de l'url, je n'ai pas trouvé autre chose, donc si tu as un lien à me donner ou autre, je n'ai trouvé que ca sur le project dir: https://symfony.com/doc/current/reference/configuration/kernel.html#project-directory

          Merci de votre aide !

          Edit:

          Je viens de testé le projet en production sur un serveur apache à distance, installé sur un vps sous centos 7, et je n'ai aucun soucis avec le file_get_content, ce n'est quand développement que j'ai ce problème. Des solutions à proposé ?

          -
          Edité par ph18232.0 27 octobre 2019 à 16:08:23

          • Partager sur Facebook
          • Partager sur Twitter

          Bien à vous, ph1823.

            29 octobre 2019 à 14:11:21

            Bonjour, je re-confirme que en mode production, le site marche parfaitement. Il n'y a que en mode développement, en ouvrant le serveur depuis la cli que j'obtient cette erreur. De plus, j'ai l'impression que la page tente de faire le rendu, puis met un 500 Internal error, et après appel la page demande, ce qui est étrange.

            Je m'explique: la page charge, elle fini par mettre un 500 internal error, puis après dans la console du serveur, j'ai un appel à la route demandé dans le file_get_contents.

            Quelqu'un saurait d'ou viens mon bug? Merci infiniment de votre aide !

            • Partager sur Facebook
            • Partager sur Twitter

            Bien à vous, ph1823.

              29 octobre 2019 à 14:16:10

              Tu as essayé de faire cette même requête HTTP (celle sur ton port 8000) avec autre chose (curl en ligne de commande par exemple) pour essayer d'en savoir plus ?

              Parce que le message de PHP est plus que vague/générique.

              Qu'est-ce qui tourne sur ce port 8000 ? Tu n'as rien de plus précis dans ses logs à lui ? (c'est là que tu trouves la 500 que tu mentionnes en réalité ? Mais tu n'as rien de plus précis ?)

              -
              Edité par julp 29 octobre 2019 à 15:15:34

              • Partager sur Facebook
              • Partager sur Twitter
                29 octobre 2019 à 14:37:02

                J'ai chargé l'url du file_get_content dans le navigateur, et ca ne donne pas de code 500. J'ai aussi tenté avec curl effectivement, et aucune erreur. Le serveur cli tourne sous le port 8000, et pour pouvoir accéder à la page il faut être connecté, sur le port 8080 soit il n'y a rien, soit le serveur apache de wampserver pour le phpMyAdmin de la base de donnée. Non le 500 internal error, je le trouve quand je tente de chargé la route minecraft_panel, mais effectivement dans les logs je le retrouve, et non il ne donne rien de plus précis, juste : "failed to open stream: HTTP Failed request", or j'arrive à chargé l'url généré sur mon navigateur et en cURL, donc je ne voit pas pourquoi symfony me renvoie un Failed Request. De plus, quand je tente depuis wampserver de file_get_contents la même url, ca marceh (avec le port du serveur symfony), et depuis symfony quand je file_get_contents une page avec une url différente de celle du serveur (donc localhost:8000) ca marche aussi. Ca ne fait le bug que avec l'url du serveur ou symfony tourne.. Je ne comprend vraiment pas.
                • Partager sur Facebook
                • Partager sur Twitter

                Bien à vous, ph1823.

                  29 octobre 2019 à 15:31:01

                  Oups, j'ai écrit 8080 au lieu de 8000.

                  Ce message d'erreur précis est levé ici. Donc quand PHP n'aurait pas véritablement une réponse ?

                  Avec curl mais depuis la même machine/dans les mêmes conditions ?

                  Tu as moyen de remplacer file_get_contents par curl (fonctions PHP), ne serait-ce que pour tester ? (parce que PHP ne sait pas gérer tout un tas de choses)

                  EDIT : ou mieux, essayer de savoir ce que le serveur en 8000 répond avec un outil comme tcpdump ou wireshark

                  -
                  Edité par julp 29 octobre 2019 à 15:47:13

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 octobre 2019 à 16:34:49

                    Quand j'appel:

                    "http://127.0.0.1:8000/panel/minecraft/1", en cURL, ou sur mon navigature, soit ca met l'erreur 500, avec HTTP Failed, quand je met le file_get_contents, et quand je passe via cURL, ca charge à l'infini. Si je met un timeout sur le cURL par contre, ca me met ceci:

                    Erreur Curl : Operation timed out after 300000 milliseconds with 0 bytes received



                    "http://127.0.0.1:8000/api/server/1/key/1": ca renvoie bien un code JSON.

                    Voici le code de la route "/panel/minecraft/{id}":

                        /**
                         * @Route("/panel/minecraft/{id}", name="minecraft_panel")
                         **/
                        public function minecraft_panel($id)
                        {
                            set_time_limit(3000);
                    
                            $url =$this->generateUrl('server_key', ['id' => $id, 'userID' => $this->getUser()->getId()],UrlGeneratorInterface::ABSOLUTE_URL);
                    
                            $response="error";
                            $hash="error";
                    
                    
                            
                            // create curl resource
                            $ch = curl_init();
                    
                            // set url
                            curl_setopt($ch, CURLOPT_URL, $url);
                    
                            //return the transfer as a string
                            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
                            curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout in seconds
                            // $output contains the output string
                            $output = curl_exec($ch);
                    
                            // Vérifie si une erreur survient
                            if(!$output)
                            {
                                echo 'Erreur Curl : ' . curl_error($ch);
                            }
                    
                            // close curl resource to free up system resources
                            curl_close($ch);
                            // $response =file_get_contents($url);
                            //$hash = json_decode($response)->{"hash"};
                    
                    
                            return $this->render('panel/minecraft.html.twig', ['home' => true, 'id' => $id, 'hash' => $hash, 'name' => "Minecraft Server", "ip" => "datahosting.fr"]);
                        }



                    à savoir que si j'enlève le set_time_limit(3000), j'obtient l'erreur Maxium excetution time .. 120 sec, et sur ma console du serveur j'ai ceci:

                    [Tue Oct 29 16:20:31 2019] 127.0.0.1:49179 [500]: /panel/minecraft/1 - Maximum execution time of 121 seconds exceeded in D:\DataHosting\V2\src\Controller\PanelContro
                    ller.php on line 41
                    [Tue Oct 29 16:20:33 2019] 127.0.0.1:49182 [200]: /api/server/1/key/1



                    Je ne comprend vraiment pas pourquoi il reçoit 0 bytes de la page, alors que en mode production ca fonction, et que sur le serveur wamp aussi.

                    Pour l'analyse avec tcpdump (j'ai utiliser winedump, je sais pas si ca change qqch) voila ce qu'il "écoute" (je ne sais pas si c'est ca, je ne connais pas du tout ce logiciel :x):

                    16:30:35.092805 IP ph1823.57155 > 239.255.255.250.1900: UDP, length 173
                    16:30:36.063842 IP6 ph1823.61194 > ff02::1:3.5355: UDP, length 46
                    16:30:36.063907 IP ph1823.61194 > 224.0.0.252.5355: UDP, length 46
                    16:30:36.093525 IP ph1823.57155 > 239.255.255.250.1900: UDP, length 173
                    16:30:36.473385 IP6 ph1823.61194 > ff02::1:3.5355: UDP, length 46
                    16:30:36.473429 IP ph1823.61194 > 224.0.0.252.5355: UDP, length 46
                    16:30:37.093986 IP ph1823.57155 > 239.255.255.250.1900: UDP, length 173
                    16:30:38.094351 IP ph1823.57155 > 239.255.255.250.1900: UDP, length 173
                    16:30:42.433916 IP6 ph1823.58381 > ff02::1:3.5355: UDP, length 90
                    16:30:42.433990 IP ph1823.58381 > 224.0.0.252.5355: UDP, length 90
                    16:30:42.843939 IP6 ph1823.58381 > ff02::1:3.5355: UDP, length 90
                    16:30:42.843997 IP ph1823.58381 > 224.0.0.252.5355: UDP, length 90
                    16:30:44.139674 IP6 ph1823.55557 > ff02::1:3.5355: UDP, length 42
                    16:30:44.139735 IP ph1823.55557 > 224.0.0.252.5355: UDP, length 42
                    16:30:44.549919 IP6 ph1823.55557 > ff02::1:3.5355: UDP, length 42
                    16:30:44.549961 IP ph1823.55557 > 224.0.0.252.5355: UDP, length 42
                    16:32:35.093819 IP ph1823.65080 > 239.255.255.250.1900: UDP, length 173
                    16:32:36.094105 IP ph1823.65080 > 239.255.255.250.1900: UDP, length 173
                    16:32:37.095882 IP ph1823.65080 > 239.255.255.250.1900: UDP, length 173
                    16:32:38.096049 IP ph1823.65080 > 239.255.255.250.1900: UDP, length 173



                    pour wireshark, il ne trouve rien (je vais tenter de reboot mon PC, car il le demande et je ne l'ai pas fait)

                    -
                    Edité par ph18232.0 29 octobre 2019 à 16:35:47

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bien à vous, ph1823.

                      29 octobre 2019 à 16:46:13

                      Il faut filtrer parce que c'est de l'UDP ce que tu montres et récupérer le contenu des paquets (requêtes/réponses complètes HTTP).

                      Mais si le serveur ne répond même pas, tu ne verras rien et c'est du côté de 127.0.0.1:8000 qu'il faut chercher.

                      Un netstat -an montre bien qu'il y a un truc en écoute sur 127.0.0.1:8000 en tcp ? (ce ne serait pas le cas, tu le saurais direct, ça ne partirait pas en timeout à moins d'avoir touché à la configuration de l'OS - sysctl par exemple sur BSD)

                      -
                      Edité par julp 29 octobre 2019 à 16:52:17

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 octobre 2019 à 17:21:49

                        Oui il écoute bien en 127.0.0.1:8000, par contre, il n'écoute pas en [::]:8000, comparé à mon serveur WAMP, et mon serveur nodeJS, et je n'ai rein trouvé pour le faire écouter sur ca.

                        Concernant wireshark, il ne se passe rien quand je met le filtre "tcp.port == 8080 || tcp.port == 80 || tcp.port == 8000 || http" que ca soit sur VirtualBox, ou sur Ethernet. Je dois mal faire quelque chose, mais je ne trouve pas d'aide sur internet, es-cee possible de m’aiguiller ?

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Bien à vous, ph1823.

                          29 octobre 2019 à 17:33:08

                          > [::]:8000

                          C'est de l'IPv6. Tu avais testé avec 127.0.0.1 à la place de localhost ? Mais il n'y a aucune raison que le système ne sache pas le résoudre.

                          > Concernant wireshark, il ne se passe rien

                          Ce n'est pas anormal si ton serveur ne répond pas.

                          Vu que tu mentionnes VirtualBox, ils sont goupillés comment tes différents services, sur tes différents environnements ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 octobre 2019 à 17:42:25

                            J'ai juste installé VirtualBox pour faire des test sur linux, du coup j'ai tout sur mon Windows, je lance le serveur php via la cli de PHPStorm avec "php bin/console s:r", après je lance wampserver sur windows aussi, et c'est tout, je ne suis pas trop sur d'avoir compris cette question, j'espère y avoir répondu au mieux ^^
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Bien à vous, ph1823.

                              29 octobre 2019 à 18:56:24

                              Tout est donc sur un même OS/"machine". Désolé, je n'ai pas plus d'idées.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 octobre 2019 à 19:57:10

                                Bon bah.. jme sens très très très con, en parcourant la documentation de symfony j'ai trouvé une fonctionné "foward" qui permet l'appel à des fonction dans un controlleur, et la ca à marché, pour ce qui souhaite voila le code :

                                        $response = $this->forward('App\Controller\API\ServerAPIController::key', [
                                            'id'  => $id,
                                            'userID' => '1',
                                        ]);

                                et la page: https://symfony.com/doc/current/controller/forwarding.html merci à tous d'avoir tenté de m'aider, je pense que tenter de passé par un file_get_contents était pas la meilleur des solutions :x

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Bien à vous, ph1823.

                                [Symfony4] Problème avec file_get_contents

                                × 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