Tester qu'un site distant est

jmh
Invité n'ayant pas de compte PHPfrance

18 nov. 2005, 14:33

Bonjour,

Sur un site, j'affiche une partie du flux rss en provenance d'un autre, distant.

Quand le serveur distant ne répond pas, cela occasionne une erreur.
Comment tester qu'un serveur soit le flux rss est disponible ?

Je travaille en php5

Merci.

ViPHP
ViPHP | 1380 Messages

18 nov. 2005, 19:39

A chaud:

Pour vérifier si un domaine répond --> fsockopen

Pour vérifier si une page est "servie" c'est à dire si elle existe ET si elle renvoie un HTTP/1.1 200 OK ---> fopen.

Le problème de fopen, c'est qu'il n'y a pas de timeout, voir discussion:
http://bugs.php.net/bug.php?id=5153&edit=1

Donc si le serveur web est planté ou ne sert pas la page complètement, ou encore, si les temps de réponses sont trop longs l'appel à fopen() fera planter ton script tant qu'il n'a pas reçu le 200 OK du serveur.

Question intéressante.

Faudra travailler avec les socket et les flux. J'y réfléchi et je poste si je trouve.
ripat

jmh
Invité n'ayant pas de compte PHPfrance

18 nov. 2005, 20:01

Merci.

je teste déjà "fsockopen".

jmh
Invité n'ayant pas de compte PHPfrance

18 nov. 2005, 21:14

"fsockopen" fonctionne.

Super génial. Merci !!!

ViPHP
ViPHP | 1380 Messages

18 nov. 2005, 21:35

fsockopen ne fera que tester si un domaine répond sur un port donné (80 pour web).

fopen pourra te dire si une page existe sur un domaine.

Si cette page existe mais est très lente à "charger" (c.à.d lente à renvoyer un 200 OK), ton script va être mis en suspens le temps que mettra la page à charger. Si tu te sers d'une page pour pomper des info d'un fil RSS, ta page va se bloquer.

J'ai trouvé une solution pour tester le temps de réponse d'une page, avec un timeout si jamais elle de répond pas tout de suite.

En gros, il faut créer un flux avec fsockopen et lui mettre un timeout sur l'appel de la page avec la fonction stream_set_timeout();

Ma petite fonction retourne le statut de la page, et son temps de réponse, si réponse il y a dans le délai du timeout.
/*
Fonction pour tester le temps de réponse d'une page.

Arguments
  domaine     (exemple: 'www.phpfrance.com')
  chemin/page (exemple: '/tutoriaux/index.php')
  timeout     (en secondes exemple: 5) Optionnel, défaut 10 secondes.   
*/

function monTestPage($site, $page, $timeout = 10){
  list($usec, $sec) = explode(" ", microtime());
  $t0 = ((float)$usec + (float)$sec); 
  $fp = fsockopen($site, 80, $errno, $errstr, $timeout);
  if (!$fp) {
    $return['msg']  = 'Impossible de se connecter au domaine '.$site.'<br />';
  } else {
    $return['serveur'] = 'Connexion serveur OK';
    $header = "GET $page HTTP/1.1\r\n";
    $header .= "Host: $site\r\n";
    $header .= "Connection: Close\r\n\r\n";
    fputs($fp, $header);
    stream_set_timeout($fp, $timeout);
    $reponse = fgets($fp, 128);
    list($usec, $sec) = explode(" ", microtime());
    $t1 = ((float)$usec + (float)$sec); 
    $info = stream_get_meta_data($fp);
    if ($info['timed_out']) {
      $return['msg'] = "Le délai de réponse de la page ".$site.$page.
      ' a dépassé le timout de '.$timeout.' sec.';
    }else{
      $return['reponsePage']  = $reponse;
      $return['tempsReponse'] = $t1 - $t0;
    }
    fclose($fp);
  }
  return $return;
}

$resultat = monTestPage ('www.phpfrance.com', '/index.php', 7);

echo '<pre>';
  print_r($resultat);
echo '</pre>';
Ceci devrait renvoyer quelque-chose comme:

Code : Tout sélectionner

Array ( [serveur] => Connexion serveur OK [reponsePage] => HTTP/1.1 200 OK [tempsReponse] => 0.0631740093231 )
Voilà, tu peux maintenant tester la réponse d'une page sans bloquer ton script.
ripat

jmh
Invité n'ayant pas de compte PHPfrance

18 nov. 2005, 22:15

Je n'ai pas compris grand chose (je suis un peu débutant). Mais je vais étudier et tester la solution. Merci.