curl and ping - Comment vérifier si un site web est en hausse ou en baisse?
Je veux vérifier si un site web est en hausse ou en baisse à une instance particulière en utilisant PHP. J'ai appris que curl va récupérer le contenu du fichier mais je ne veux pas lire le contenu du site web. Je veux juste vérifier l'état du site. Est-il possible de vérifier l'état du site? Peut - on utiliser ping pour vérifier l'état? Il me suffit d'obtenir les signaux d'état comme (404, 403, etc.) du serveur. Un petit extrait de code pourrait beaucoup m'aider.
7 réponses
Quelque chose comme ça devrait fonctionner
$url = 'yoururl';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (200==$retcode) {
// All's well
} else {
// not so much
}
function checkStatus($url) {
$agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; pt-pt) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27";
// initializes curl session
$ch = curl_init();
// sets the URL to fetch
curl_setopt($ch, CURLOPT_URL, $url);
// sets the content of the User-Agent header
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
// make sure you only check the header - taken from the answer above
curl_setopt($ch, CURLOPT_NOBODY, true);
// follow "Location: " redirects
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// disable output verbose information
curl_setopt($ch, CURLOPT_VERBOSE, false);
// max number of seconds to allow cURL function to execute
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
// execute
curl_exec($ch);
// get HTTP response code
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpcode >= 200 && $httpcode < 300)
return true;
else
return false;
}
// how to use
//===================
if ($this->checkStatus("http://www.dineshrabara.in"))
echo "Website is up";
else
echo "Website is down";
exit;
Avez-vous vu la fonction get_headers ()? http://it.php.net/manual/en/function.get-headers.php . Il semble faire exactement ce dont vous avez besoin.
Si vous utilisez curl directement avec le drapeau-I, il retournera les en-têtes HTTP (404 etc) au lieu de la page HTML. En PHP, l'équivalent est l'option curl_setopt($ch, CURLOPT_NOBODY, 1);
.
Voici comment je l'ai fait. J'ai défini l'agent utilisateur pour minimiser les chances que la cible me bannisse et j'ai également désactivé la vérification SSL puisque je connais la cible:
private static function checkSite( $url ) {
$useragent = $_SERVER['HTTP_USER_AGENT'];
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // do not return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_USERAGENT => $useragent, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 2, // timeout on connect (in seconds)
CURLOPT_TIMEOUT => 2, // timeout on response (in seconds)
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // SSL verification not required
CURLOPT_SSL_VERIFYHOST => false, // SSL verification not required
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
curl_exec( $ch );
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpcode == 200);
}
ping
ne fera pas ce que vous cherchez - il vous dira seulement si la machine est en marche (et répond à ping
). Cela ne signifie pas nécessairement que le serveur web est en place, cependant.
Vous pouvez essayer d'utiliser la méthode http_head - elle récupérera les en-têtes que le serveur web vous renvoie. Si le serveur renvoie des en-têtes, vous savez qu'il est opérationnel.
Vous ne pouvez pas tester un serveur Web avec ping
, car c'est un service différent. Le serveur peut s'exécuter, mais le démon du serveur web peut être écrasé de toute façon. Donc curl est ton ami. Ignorez simplement le contenu.