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.