2012-04-01 32 views
7

Estoy tratando de hacer un script PHP que verifique el estado HTTP de un sitio web lo más rápido posible.Algo más rápido que get_headers()

Actualmente estoy usando get_headers() y ejecutándolo en un bucle de 200 URL aleatorios de la base de datos mysql.

Para verificar todos los 200, toma un promedio de 2m 48s.

¿Hay algo que pueda hacer para que sea (mucho) más rápido?

(Sé de fsockopen: puede verificar el puerto 80 en 200 sitios en 20, pero no es lo mismo que solicitar el código de estado http porque el servidor puede responder en el puerto, pero puede que no esté cargando sitios web correctamente, etc.)

Este es el código ..

<?php 
    function get_httpcode($url) { 
    $headers = get_headers($url, 0); 
    // Return http status code 
    return substr($headers[0], 9, 3); 
    } 

    ### 
    ## Grab task and execute it 
    ### 


    // Loop through task 
    while($data = mysql_fetch_assoc($sql)): 

     $result = get_httpcode('http://'.$data['url']); 
     echo $data['url'].' = '.$result.'<br/>'; 

    endwhile; 
?> 

Respuesta

6

Usted puede tratar de la biblioteca CURL. Puede enviar múltiples solicitud paralela al mismo tiempo con CURL_MULTI_EXEC

Ejemplo:

$ch = curl_init('http_url'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
$c = curl_exec($ch); 
$info = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
print_r($info); 

ACTUALIZADO

Mira este ejemplo. http://www.codediesel.com/php/parallel-curl-execution/

+1

Hola, también he intentado usar cURL, como el código que ha publicado. Pero es lo mismo, de hecho un poco más largo que get_headers(); – Clarkey

+1

Intente hacer una solicitud múltiple como le doy el enlace de arriba. Por ejemplo, 10 solicitudes por tiempo – safarov

+0

+1 ¡Bonito! No sabía que la extensión curl podría procesar solicitudes en paralelo. – nnichols

3

No sé si esto es una opción que se puede considerar, pero se puede ejecutar todos ellos casi al mismo usando un tenedor, de esta manera el guión tomar sólo un poco más de una solicitud http://www.php.net/manual/en/function.pcntl-fork.php

se podría añadir esto en un script que se corrió en el modo CLI y poner en marcha todas las solicitudes al mismo tiempo, por ejemplo

Editar: que decir que tiene 200 llamadas que hacer, por lo que una cosa Es posible que experimente la pérdida de conexión de la base de datos. el problema es causado por el hecho de que el enlace se destruye cuando se completa el primer script. para evitar que pueda crear una nueva conexión para cada niño. Veo que está utilizando las funciones estándar mysql_ *, así que asegúrese de pasar el 4 ° parámetro para asegurarse de crear un nuevo enlace cada vez. también verifique el número máximo de conexiones simultáneas en su servidor

+0

Esto es lo que busco, echaré un vistazo a tu enlace, gracias. – Clarkey

+0

@MattClarke ok, me alegra que lo encuentre útil ... necesitará ejecutar el tenedor en la iteración donde obtiene los resultados y hacer ping al sitio si está en el niño o continuar si está en el padre – mishu

+0

I ' No estoy siguiendo lo que dices: este negocio de tenedores es completamente nuevo para mí, ni siquiera sabía que fuera posible. – Clarkey

Cuestiones relacionadas