2011-01-05 9 views
19

Quiero verificar si un sitio web está activo o inactivo en una instancia particular usando PHP. Llegué a saber que curl buscará el contenido del archivo, pero no quiero leer el contenido del sitio web. Solo quiero verificar el estado del sitio web. ¿Hay alguna forma de verificar el estado del sitio? ¿Podemos usar ping para verificar el estado? Para mí es suficiente obtener las señales de estado (404, 403, etc.) del servidor. Un pequeño fragmento de código podría ayudarme mucho.curl y ping: ¿cómo verificar si un sitio web está activo o inactivo?

+2

¿Cómo se define 'up'? ¿Una página en blanco que devuelve HTTP '200' está activa? – webbiedave

+0

@Nate: ¡Gracias por su edición! Este – brainless

Respuesta

42

algo como esto debería funcionar

$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 
    } 
+1

También prefiero configurar 'CURLOPT_CONNECTTIMEOUT' y' CURLOPT_TIMEOUT' para bajar los valores. – machineaddict

+0

@machineaddict ¿Quiere decir "sitio fuera de línea" en lugar de esperar la conexión? No veo la diferencia entre verificar 2 veces por una cosa y esperar unos pocos para la operación actual. – erm3nda

+0

@machineaddict Incluso con CURLOPT_FOLLOWLOCATION establecido en verdadero, todavía devuelve un código de retorno 301 ... ¿Cómo es posible? –

5

¿Has visto la función get_headers()? http://it.php.net/manual/en/function.get-headers.php. Parece hacer exactamente lo que necesitas.

Si utiliza rizo directamente con la opción -I, devolverá las cabeceras HTTP (404, etc.) en lugar de la página HTML. En PHP, el equivalente es la opción curl_setopt($ch, CURLOPT_NOBODY, 1);.

2

ping no hará lo que está buscando, solo le informará si la máquina está activa (y responde al ping). Sin embargo, eso no significa necesariamente que el servidor web esté activo.

Puede intentar usar el método http_head - recuperará los encabezados que el servidor web le devuelve. Si el servidor está enviando encabezados, entonces sabrá que está en funcionamiento.

+0

http://ca.php.net/http_head hipervínculo incrustado redirige a http://ca.php.net/manual-lookup.php?pattern=http_head&lang=en&scope=404quickref cual el mensaje siguiente: *** * http_head * no existe. Partidos más cercanos: *. La respuesta debe ser editada para contener la referencia correcta. –

2

No se puede probar un servidor web con ping, porque es un servicio diferente. El servidor puede estar ejecutándose, pero el webserver-daemon puede colapsarse de todos modos. Entonces curl es tu amigo. Solo ignora el contenido.

9
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; 
6
curl -Is $url | grep HTTP | cut -d ' ' -f2 
+11

al proporcionar código que resuelve el problema, lo mejor es también dé al menos una breve explicación de cómo funciona para que la gente que lee no tenga que analizarlo mentalmente línea por línea para entender las diferencias. – Fluffeh

4

Aquí es cómo lo hice. Configuré el agente de usuario para minimizar la posibilidad de que el objetivo me prohibiera y también deshabilité la verificación SSL ya que conozco el objetivo:

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); 
} 
Cuestiones relacionadas