web-dev-qa-db-fra.com

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. Je veux juste vérifier l'état du site Web. Existe-t-il un moyen de vérifier l'état du site? Pouvons-nous 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 m'aider beaucoup.

23
brainless

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
    }
44
Jeff Busby
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;
9
Dinesh Rabara
curl -Is $url | grep HTTP | cut -d ' ' -f2
7
ratz

Voici comment je l'ai fait. J'ai défini l'agent utilisateur pour minimiser les risques que la cible m'interdise et j'ai également désactivé la vérification SSL car 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);
}
5
Daniel Szalay

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 l'indicateur -I, il renverra 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);.

5
mikel

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 voudrez peut-être 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.

4
girasquid

Vous ne pouvez pas tester un serveur Web avec ping, car c'est un service différent. Le serveur est peut-être en cours d'exécution, mais le démon du serveur Web peut être bloqué de toute façon. Alors curl est ton ami. Ignorez simplement le contenu.

2
KingCrunch