2
votes

Erreur avec la fonction file_get_contents (): DNS impliqué ou pas?

J'essaie de gérer un petit site Web hébergé sur un serveur virtuel distant.

Mon code fonctionnait bien lorsque j'exécutais mes tests localement, sur ma machine via Apache 2.0.

Maintenant qu'il est hébergé à distance (Apache 2 + Webmin + dernière version de PHP), il me semble que je J'ai un problème avec la fameuse fonction file_get_contents. Il semble que mon serveur n'autorise la résolution d'aucun domaine externe.

J'ai lu plusieurs sujets et essayé de nombreuses solutions, mais il semble qu'aucune d'elles n'a fonctionné jusqu'à présent.

Ici est la fonction avec laquelle j'ai un problème

Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known in

me renvoie cette erreur quoi que j'essaie

$url='https://bitpay.com/api/rates';
$json=json_decode( file_get_contents( $url ) );
$dollar=$btc=0;

foreach( $json as $obj ){
    if( $obj->code=='USD' )$btc=$obj->rate;
}

echo "1 bitcoin=\$" . $btc . "USD<br />";
$dollar=1 / $btc;
echo "10 dollars = " . round( $dollar * 10,8 )."BTC";

exit();

J'ai essayé de localiser le fichier etc / host sur mon serveur mais il est inexistant.

Je ne sais pas comment configurer / paramétrer un nom d'hôte.

Je n'ai pas beaucoup d'options dans mon panneau Webmin donc je me demande ce que je peux faire pour travailler vers la résolution de ce problème.

J'ai ajouté la ligne allow_url_fopen = on dans mon code mais cela ne fonctionne pas non plus.

Enfin, je essayé l'alternative curl que beaucoup d'entre vous conseillent.

Mais quand j'essaye de echo ou print_r la sortie / résultat, j'obtiens un blanc page. Pas même un seul message d'erreur.


18 commentaires

Eh bien, l'URL: bitpay.com redirige vers: bitpay.com . De plus, le contenu de l'URL n'est pas au format JSON, mais vous utilisez json_decode


Il semble que votre serveur ne puisse pas se connecter au monde extérieur. Si vous en avez l'autorisation, essayez de remplacer les serveurs de noms de votre fichier /etc/resolv.conf par d'autres serveurs de noms.


hé, mon mauvais, l'url est: $ url = ' bitpay.com/api/rates ';


"On dirait que votre serveur ne peut pas se connecter au monde extérieur. Si vous avez la permission, essayez de changer les serveurs de noms dans votre fichier /etc/resolv.conf en d'autres serveurs de noms" J'aurais aimé pouvoir mais je n'ai aucune option pour cela. Aucun fichier resolv.conf sur mon serveur et mon panneau Webmin n'affiche rien par rapport à ces fichiers de configuration


Dois-je simplement créer un fichier resolution.conf à partir de zéro, ajouter le serveur de noms / nom de domaine que je veux résoudre et le télécharger via sftp?


"J'ai ajouté la ligne allow_url_fopen = on dans mon code" - Si votre code? C'est le paramètre de configuration pour php.ini, pas quelque chose qui devrait être dans votre code.


Je dirais que le serveur DNS n'est probablement pas configuré correctement. Si vous n'utilisez pas de serveur dédié, c'est probablement une question pour votre hébergeur.


Essayez la solution dans stackoverflow.com/questions/542046/… aussi


Quand vous avez conclu que vous n'aviez pas de /etc/resolve.conf , comment avez-vous procédé? Je n'ai rencontré aucune dist linux qui n'a pas ça? Sur quel système d'exploitation le serveur fonctionne-t-il?


Pouvez-vous envoyer une requête ping à un site Web externe comme google.com ou à tout autre site Web?


à Quentin> Je sais qu'il devrait être dans mon fichier php.ini (qui est inexistant sur mon serveur distant d'ailleurs) mais pour les besoins du test, je l'ai juste inclus (à la dure) sur ma page php, juste au-dessus ma fonction. Cela fait-il une différence pour ce test?


à apocrifos> Je suppose que j'utilise un serveur virtuel partagé. Le panneau webmin et les fonctions limitées sont probablement un indice.


à Magnus Eriksson> C'est censé être une distribution Linux. Je viens de parcourir mon dossier etc /, il n'y a rien dedans. J'ai juste essayé de créer et de télécharger hosts.conf / resolv.conf avec l'adresse IP de bitpay.com + le serveur de noms mais ne fonctionne toujours pas


à Liron> par mon code tu veux dire? Parce que je le répète, je suis personnellement sur une distribution Linux mais mon serveur n'est pas hébergé localement (il est hébergé à distance sur une distribution Apache / Linux)


même après avoir manuellement ajouté et téléchargé le fichier hosts.conf dans mon dossier etc /, dans lequel j'ai inclus ces deux lignes suivantes 104.18.90.37 bitpay.com 104.18.90.37 www.bitpay.com bien, je reçois toujours ce message d'erreur d'avertissement


un peu plus d'informations sur mon serveur / service d'hébergement: Debian GNU / Système d'exploitation Linux / Domaine dédié et personnalisé / Panneau de configuration Virtualmin avec outils de téléchargement / téléchargement / Serveur isolé.


à apokryfos> J'ai déjà essayé cette solution sans aucun résultat positif


Avertissement: file_get_contents ( 104.18.90.37 ): impossible d'ouvrir le flux: le réseau est inaccessible dans


3 Réponses :


0
votes

file_get_contents n'autorise pas la récupération d'url externe tant que allow_url_fopen n'est pas défini sur On. Puisque vous l'avez déjà réglé sur Activé. vous pouvez essayer ce code:

<?php

function get_content($URL){
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_URL, $URL);
      $data = curl_exec($ch);
      curl_close($ch);
      return $data;
}

echo get_content('https://bitpay.com/');

?>

Cependant la page ne se chargera pas correctement car sur le site cible le chemin absolu des ressources (images, scripts, etc.) est utilisé. Donc besoin du chemin vers l'URL complète.


4 commentaires

Eh bien, j'ai créé un fichier php.ini que j'ai téléchargé dans mon dossier public_html car aucun fichier .ini n'existait sur mon serveur. Arrêtez-moi si ce n'était pas la bonne chose à faire. Quoi qu'il en soit, oui, je me suis assuré d'inclure la ligne allow_url_fopen = on mais cela n'a pas résolu mon problème. Comme pour l'exemple / alternative de curl. Je l'ai essayé plusieurs fois avant parce que je l'ai vu comme une solution sur de nombreux articles, mais cela me renvoie une page blanche. Aucun résultat, aucune erreur


Essayez de vider l'objet de ressource curl et voyez s'il manque quelque chose. Au fait, j'ai utilisé ce code et cela fonctionne très bien. Découvrez-le ici: versebook.in/stkovflw/test1.php


Je ne peux pas résoudre l'hôte dans aucune fonction cURL. J'ai essayé encore et encore. Je commence à soupçonner que mon hébergeur a simplement désactivé l'accès à la demande https de son côté. Serait-il possible ?


BEcause jusqu'ici, j'ai essayé d'activer et de désactiver allow_url_fopen et allow_url_include, mais je n'ai rien changé.



0
votes

J'ai apporté quelques modifications à mon fichier php.ini.

voici le contenu de mon fichier php.ini actuel

allow_url_fopen = On;
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Mais j'ai réalisé quelque chose d'intrigant: concernant cette ligne

ini_set ('display_errors' , 1);

Si je ne l'ajoute pas dans mon fichier php où se trouve mon code, l'erreur ne s'affiche pas. Il semble que mon fichier ini ne soit pas au bon endroit ou pris en compte par le serveur.

Je suis vraiment confus car il est très différent de l'hébergement local

Je me sens la configuration de mon serveur est nulle.

Aucun fichier de configuration ne peut être trouvé dans le répertoire etc et mon fichier php.ini "ne fonctionne pas" évidemment.


0 commentaires

0
votes

N'importe qui pourrait résoudre ce problème sans avoir accès au fichier hosts.conf?


0 commentaires