2012-04-01 7 views
7

Sto provando a creare uno script PHP che verificherà lo stato HTTP di un sito Web il più velocemente possibile.Qualcosa di più veloce di get_headers()

Attualmente sto usando get_headers() ed eseguendolo in un ciclo di 200 URL casuali dal database mysql.

Per controllare tutti i 200 - ci vogliono in media 2m 48s.

C'è qualcosa che posso fare per renderlo (molto) più veloce?

(So di fsockopen - Può controllare la porta 80 su 200 siti in 20 secondi - ma non è la stessa cosa che richiedere il codice di stato http perché il server può rispondere sulla porta - ma potrebbe non caricare i siti web correttamente, ecc.)

Ecco il codice ..

<?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; 
?> 

risposta

6

Si può provare libreria CURL. È possibile inviare più richiesta in parallelo allo stesso tempo con CURL_MULTI_EXEC

Esempio:

$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); 

AGGIORNATO

Guardate questo esempio. http://www.codediesel.com/php/parallel-curl-execution/

+1

Ciao, ho anche provato a usare cURL - come il codice che hai postato. Ma è lo stesso, un po 'più a lungo di get_headers(); – Clarkey

+1

Prova a fare una richiesta multipla come fornisco il link sopra. Ad esempio 10 richieste per volta – safarov

+0

+1 Bella! Non sapevo che l'estensione del ricciolo potesse elaborare richieste in parallelo. – nnichols

3

Non so se questa è un'opzione che si può considerare, ma è possibile eseguire tutti loro quasi allo stesso con una forchetta, in questo modo lo script avrà solo un po 'più a lungo di una richiesta http://www.php.net/manual/en/function.pcntl-fork.php

si potrebbe aggiungere questo in uno script che si correva in modalità CLI e lanciare tutte le richieste allo stesso tempo, ad esempio

Edit: voi dire che hai 200 telefonate da fare, così una cosa si potrebbe verificare la perdita della connessione al database. il problema è causato dal fatto che il collegamento viene distrutto al termine del primo script. per evitare che tu possa creare una nuova connessione per ogni bambino. Vedo che stai utilizzando le funzioni standard mysql_ *, quindi assicurati di passare il 4 ° parametro per essere sicuro di creare ogni volta un nuovo collegamento. controlla anche il numero massimo di connessioni simultanee sul tuo server

+0

Questo è quello che cerco - darò un'occhiata al tuo link, grazie. – Clarkey

+0

@MattClarke ok, sono contento che lo trovi utile .. dovrai eseguire il fork nell'iterazione in cui ottieni i risultati e fai il ping del sito se sei nel bambino o continua se sei nella genitore – mishu

+0

I ' Non sto seguendo quello che dici - questo business della forcella è completamente nuovo per me, non sapevo nemmeno che fosse possibile. – Clarkey