73 votes

php_network_getaddresses : getaddrinfo a échoué : Nom ou service non connu

Voici un extrait de mon code

$fp = fsockopen($s['url'], 80, $errno, $errstr, 5);
if($fp){
        fwrite($fp, $out);
        fclose($fp);

Quand je l'exécute, il sort :

Impossible de se connecter à www.mydomain.net/1/file.php:80 (php_network_getaddresses : getaddrinfo failed : Nom ou service non connu

Je l'utilise pour soumettre des données GET à l'application $s['url']

Je n'arrive pas à comprendre pourquoi. Toute aide serait grandement appréciée.

0 votes

L'adresse distante est-elle accessible ? Le DNS est-il résolu ?

1 votes

Oui. En fait, je l'ai actuellement en train d'accéder à une url sur le même serveur.

2 votes

J'ai rencontré la même erreur mais je pense que cela provenait d'une mauvaise configuration du serveur dans "etc/resolf.conf" et "etc/hosts".

38voto

zombat Points 46702

Vous ne pouvez pas ouvrir une connexion directement à un chemin sur un hôte distant en utilisant fsockopen . L'url www.mydomain.net/1/file.php contient un chemin, alors que la seule valeur valide pour ce premier paramètre est l'hôte, www.mydomain.net .

Si vous essayez d'accéder à une URL distante, alors fichier_get_contenu() est votre meilleure chance. Vous pouvez fournir une URL complète à cette fonction, qui ira chercher le contenu à cet endroit à l'aide d'une requête HTTP normale.

Si vous souhaitez uniquement envoyer une requête HTTP et ignorer la réponse, vous pouvez pourrait utiliser fsockopen() et envoyer manuellement les en-têtes de requête HTTP, en ignorant toute réponse. Cela peut être plus facile avec cURL ou tout simplement fopen() qui ouvrira la connexion mais ne lira pas nécessairement de réponse. Si vous vouliez le faire avec fsockopen() il pourrait ressembler à quelque chose comme ça :

$fp = fsockopen("www.mydomain.net", 80, $errno, $errstr, 30);
fputs($fp, "GET /1/file.php HTTP/1.1\n");
fputs($fp, "Host: www.mydomain.net\n");
fputs($fp, "Connection: close\n\n"); 

La gestion des erreurs vous incombe bien sûr, mais vous ne perdrez pas de temps à lire la réponse.

0 votes

Je n'ai pas besoin de récupérer le contenu, seulement de soumettre les données GET. Est-ce que cela serait particulièrement important, ou est-ce que cela serait bien de toute façon ? c.-à-d. file_get_contents(" domain.com/file.php?action=this&get=that" ) ;

1 votes

C'est bon, vous pouvez simplement ignorer la valeur de retour de file_get_contents.

0 votes

C'est ce que je pensais. Je vais essayer et je reviendrai.

28voto

Johan Points 99

J'ai eu un problème similaire sur mon serveur de tests local et mes domaines de tests locaux, par exemple : www.testdomain.loc avec la fonction GetImageSize() ;

Je l'ai résolu en ajoutant le nom d'hôte dans le fichier hosts du serveur local :

Dans le fichier /etc/hosts J'ai ajouté :

192.168.1.1 www.testdomain.loc

0 votes

Bien que cela fonctionne pour la plupart des méthodes basées sur la résolution dns, cela n'est pas applicable avec fsockopen() et par conséquent cette question (pour vérifier, créez un fichier de test qui est un copier-coller du code de l'OP et utilisez une URL web similaire à www.mydomain.net/1/file.php et vous comprendrez pourquoi).

24voto

elias Points 906

Si vous voulez seulement soumettre des données GET à l'URL, vous devriez utiliser quelque chose de simple comme file_get_contents() ;

$myGetData = "?var1=val1&var2=val2";
file_get_contents($url.$myGetData);

0 votes

Bon sang, ça rend les choses trop faciles. Une seconde, je vais essayer.

3 votes

Bienvenue dans le monde simple de PHP xD

7 votes

Il s'agit d'une solution alternative au problème de code, mais qui ne résout pas le problème d'infrastructure sous-jacent (échec de la recherche de DNS). Comme je rencontre le même problème à partir de Drupal, pirater le projet de quelqu'un d'autre est une option indésirable pour moi : à la place, je peux recommander l'autre réponse dans ce fil de discussion, impliquant /etc/hosts, qui a effectivement résolu mon DNS.

4voto

Ap.Muthu Points 11
$url = "http://user:pass@www.example.com/abc.php?var1=def";
$contents = file_get_contents($url);
echo $contents;

2voto

farzad Points 4180

Vous essayez d'ouvrir un socket vers un fichier sur l'hôte distant, ce qui n'est pas correct. vous pouvez établir une connexion socket (TCP/UDP) vers un numéro de port sur un hôte distant. votre code devrait donc être le suivant :

fsockopen('www.mysite.com', 80);

si vous essayez de créer une ressource de type pointeur de fichier vers un fichier distant, vous pouvez utiliser la fonction fopen(). mais pour ce faire, vous devez également spécifier le protocole de l'application.

PHP fournit des wrappers de flux par défaut pour les ouvertures de fichiers URL. En fonction du schéma de l'URL, le wrapper de flux approprié sera appelé en interne. L'URL que vous essayez d'ouvrir n'a pas de schéma valide pour cette solution. Assurez-vous qu'elle contient un schéma comme "http://" ou "ftp://".

donc le code serait comme ceci :

$fp = fopen('http://www.mysite.com/path/file.txt');

De plus, je ne pense pas que le wrapper HTTP stream (qui gère les actions sur les ressources de fichiers sur les URL avec le schéma http) supporte l'écriture de données. Vous pouvez utiliser fread() pour lire le contenu d'une URL via HTTP, mais je ne suis pas sûr pour l'écriture.

EDIT : à partir des commentaires et d'autres réponses, j'ai compris que vous deviez envoyer une requête HTTP à l'URL spécifiée. Les méthodes décrites dans cette réponse sont destinées à recevoir des données de l'URL distante. Si vous voulez envoyer des données, vous pouvez utiliser http_request() pour le faire.

0 votes

Ce que je fais, c'est soumettre des données GET à l'adresse $s['url'].

0 votes

Il est possible de remplacer les adresses codées en dur dans les URL par les données que vous recevez par GET. Mais assurez-vous qu'il y a un schéma et si ce n'est pas le cas, ajoutez un 'http://' par défaut. Utilisez la fonction parse_url() pour vous assurer qu'il y a un schéma dans l'URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X