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 !
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:
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.
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é ?
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 !
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 ?)
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.
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
"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):
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)
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 ?
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
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 :
× 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.
Bien à vous, ph1823.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Bien à vous, ph1823.
Bien à vous, ph1823.
Bien à vous, ph1823.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Bien à vous, ph1823.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Bien à vous, ph1823.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Bien à vous, ph1823.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Bien à vous, ph1823.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Bien à vous, ph1823.