[RESOLU] file_get_contents("URL"): failed to open stream: Connection timed out in "PATH" on line XX

Eléphant du PHP | 50 Messages

30 avr. 2019, 14:47

Bonjour,
Je suis confronté à quelque chose qui me dépasse complètement et qui n'est pas logique dans ma petite tête, il est évident que c'est moi qui me*de quelque part mais je ne vois pas où ...

Dans ma page d'erreur personnalisée 404.php, j'ai ce code :
<?php
    header("X-Robots-Tag: noindex, nofollow, noarchive");
    header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
    header("Pragma: no-cache"); // HTTP 1.0.
    header("Expires: ".gmdate('D, d M Y H:i:s', time() - 3600)." GMT"); // Proxies.
    header("Content-Type: text/html; charset=utf-8");

    $apiUrl = "https://ipinfo.io/%s/json?token=%s";
    $ip = $_SERVER["REMOTE_ADDR"];
    $apiKey = "0123456789ABCD";
    $apiResult = file_get_contents(sprintf($apiUrl, $ip, $apiKey));
    $jsonResult = json_decode($apiResult);
    if (empty($new_address)) {
        // Format date, hour, timezone
        $date_hour_timezone = date("Y-m-d H:i:s \U\T\CP", time());
        // Page / Folder / File requested
        $request = $_SERVER["REQUEST_URI"];
        // Format text
        $text = "\n".'Error 404 => '.$date_hour_timezone.' => Request : '.$request.' => IP: '.$ip.' => City: '.$jsonResult->city.' => Country: '.$jsonResult->country.' => Lat, Lon: '.$jsonResult->loc;
        // Select path log file
        $file = $_SERVER["DOCUMENT_ROOT"].'/404.txt';
        // Add $text in $file
        $fp = fopen($file, "a+");
        fputs($fp, $text);
        fclose($fp);
    }
?>

<!doctype html>
<html>

    <head>
        <title>PSEUDO.free.fr - 404</title>
    </head>

    <body>
        <style>
            body {
                background-image: url(/img/404.png);
                background-size: cover;
            }
        </style>
    </body>

</html>

Quand je test ça me renvoie ceci :
Warning: file_get_contents(https://ipinfo.io/XXX.XXX.XXX.XXX/json?token=0123456789ABCD): failed to open stream: Connection timed out in /var/www/sdb/8/e/PSEUDO/404.php on line 11
#-o

La ligne 11 c'est
$apiResult = file_get_contents(sprintf($apiUrl, $ip, $apiKey));


Si je test l'URL : https://ipinfo.io/XXX.XXX.XXX.XXX/json? ... 456789ABCD dans mon navigateur, je réceptionne un fichier JSON comme ceci :
{
  "ip": "XXX.XXX.XXX.XXX",
  "hostname": "ld256-1-XXX-XXX-XX-XXX.fbx.proxad.net",
  "city": "MaVille",
  "region": "Brittany",
  "country": "FR",
  "loc": "XX.XXXX,-X.XXXX",
  "postal": "56XXX",
  "org": "AS12322 Free SAS"
}
Donc je comprends pas ... ça fonctionne correctement du navigateur mais pas du serveur et c'est pourtant la même adresse ... J'ai oublié quelque chose mais je ne sais pas quoi ...
Merci de vos lumières

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 avr. 2019, 16:57

Pour débuguer fait une page PHP vierge avec juste le minimum :
<?php
echo file_get_contents("https://ton_utl_complete");
Si ça ne marche pas essaye en http, plutôt qu'en https.

Si ça ne marche toujours pas, et si tu as un accès SSH sur ta machine, essaye un wget http://ton_url_complete

Si cela ne marche toujours pas, cela peut venir :
- de ton hébergeur qui bloquerai les accès à distance à ce site => Contacte le
- du service distant qui filtrerait les demandes depuis ton hébergeur (par exemple si il y a eu trop de demande émise depuis ton hébergeur)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 50 Messages

30 avr. 2019, 18:46

Ok merci @rthur je fais ça ce soir là j'ai le cerveau en ébullition ...
j'ai tenté cette méthode
    $apiUrl = 'https://ipinfo.io/%s/json?token=%s';
    $ip = $_SERVER["REMOTE_ADDR"];
    $apiKey = 'MY_API_KEY';
    $curlSession = curl_init();
    curl_setopt($curlSession, CURLOPT_URL, sprintf($apiUrl, $ip, $apiKey));
    curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
    $jsonResult = json_decode(curl_exec($curlSession));
    curl_close($curlSession);
        
    if (empty($new_address)) {
        // Format date, hour, timezone
        $date_hour_timezone = date("Y-m-d H:i:s \U\T\CP", time());
        // Page / Folder / File requested
        $request = $_SERVER["REQUEST_URI"];
        // Format text
        $text = "\n".'Error 404 => '.$date_hour_timezone.' => Request : '.$request.' => IP: '.$ip.' => City: '.$jsonResult->city.' => Country: '.$jsonResult->country.' => Lat, Lon: '.$jsonResult->loc;
        // Select path log file
        $file = $_SERVER["DOCUMENT_ROOT"].'/404.txt';
        // Add $text in $file
        $fp = fopen($file, "a+");
        fputs($fp, $text);
        fclose($fp);
    }
Idem il veut rien savoir ... |*()

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 avr. 2019, 18:55

Fait une page avec le minimum, c'est la meilleure méthode pour débuguer
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 50 Messages

30 avr. 2019, 20:48

test.php (https)
<?php
    echo file_get_contents("https://ipinfo.io/xxx.xxx.xxx.xxx/json?token=0123456789ABCD");
?>
Résultat
Warning: file_get_contents(https://ipinfo.io/xxx.xxx.xxx.xxx/json?token=0123456789ABCD): failed to open stream: Connection timed out in /var/www/sdb/8/e/gegax/test.php on line 2

test.php (http)
<?php
    echo file_get_contents("http://ipinfo.io/xxx.xxx.xxx.xxx/json?token=0123456789ABCD");
?>
Résultat
Warning: file_get_contents(http://ipinfo.io/xxx.xxx.xxx.xxx/json?token=0123456789ABCD): failed to open stream: Connection timed out in /var/www/sdb/8/e/gegax/test.php on line 2

SSH je vais regarder.


J'ai trouvé ça en revanche ...
Image
C'est pour ma pomme, nan ? (php v5.6.34 pour mon serveur)

Eléphant du PHP | 50 Messages

30 avr. 2019, 21:10

Bon le problème est résolu ...
Le seul service GeoIP pour les pages perso Free.fr autorisé est geolite.maxmind.com ... (faut le savoir et surtout où aller chercher l'info ...)
Je pouvais toujours chercher le pourquoi du comment ...
Merci pour ton aide @rthur, je laisse ouvert pour l'instant au cas ou je galère grave avec maxmachinchose ...
Je passerais en résolu en temps voulu :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 avr. 2019, 22:26

Tu as trouvé d'où vient le message d'erreur que tu as mis en objet du coup ce sujet est résolu.
Tu en ouvriras un autre si tu rencontres un autre souci ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 2 Messages

31 août 2019, 08:11

Bonjour,
Je suis dans la même situation
Du coup, peux-tu nous donner la requête type sur geolite.maxmind.com qui fonctionne chez free ?
Merci beaucoup

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

31 août 2019, 12:39

Maxmind a une doc pour cela :
https://maxmind.github.io/GeoIP2-php/

Les bases de geoloc gratuites sont disponibles au téléchargement sur cette page :
https://dev.maxmind.com/geoip/geoip2/geolite2/
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 2 Messages

31 août 2019, 16:46

Hé oui, mais ils expliquent comment télécharger les bases
J'aurais préféré une requête avec un file_get_contents( sur geolite.maxmind.com ...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 sept. 2019, 01:12

Bah tu fais un file_get_contents() justement pour télécharger les bases régulièrement, et ensuite tu as juste à utiliser leur librairie et la base précédemment téléchargé pour obtenir en local les infos.

Si tu ne veux pas utiliser les bases gratuites, Maxmind propose aussi un webservice interrogeable à la volée, mais celui ci est payant (mais plutôt abordable) :
https://www.maxmind.com/en/geoip2-precision-services
Quand tout le reste a échoué, lisez le mode d'emploi...