2012-04-01 11 views
7

Ich versuche, ein PHP-Skript, das den HTTP-Status einer Website so schnell wie möglich überprüfen wird.Etwas schneller als get_headers()

Ich verwende derzeit get_headers() und es in einer Schleife von 200 zufälligen URLs von MySQL-Datenbank ausführen.

Um alle 200 zu überprüfen - es dauert durchschnittlich 2m 48s.

Kann ich irgendetwas (viel) schneller machen?

(Ich weiß über fsockopen - Es kann Port 80 auf 200 Seiten in 20s überprüfen - aber es ist nicht das gleiche wie die Anfrage des HTTP-Status-Code, weil der Server auf den Port reagiert - aber möglicherweise nicht laden Websites usw.) Hier

ist der Code ..

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

Antwort

6

Sie ROTATION Bibliothek versuchen.

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

dieses Beispiel

Schauen AKTUALISIERT: Sie können mehrere Anfrage parallel zur gleichen Zeit mit CURL_MULTI_EXEC

Beispiel senden. http://www.codediesel.com/php/parallel-curl-execution/

+1

Hallo, ich habe auch versucht mit cURL - wie der Code, den Sie gebucht haben. Aber es ist dasselbe, tatsächlich etwas länger als get_headers(); – Clarkey

+1

Versuchen Sie multi Anfrage, wie ich Link oben gebe. Zum Beispiel 10 Anfrage pro Zeit – safarov

+0

+1 Nice one! Ich wusste nicht, dass die Curl-Erweiterung Anfragen parallel verarbeiten könnte. – nnichols

3

Ich weiß nicht, ob dies eine Option, die Sie betrachten können, aber man kann sie alle fast gleichzeitig mit einer Gabel, auf diese Weise das Skript dauert nur etwas länger als eine Anforderung http://www.php.net/manual/en/function.pcntl-fork.php läuft

Sie könnte dies in einem Skript hinzufügen, die in cli-Modus lief und starten alle Anfragen zur gleichen Zeit, zum Beispiel

Edit: Sie sagen, dass Sie 200 Anrufe zu machen, so ein Ding Sie können den Datenbankverbindungsverlust feststellen. Das Problem wird dadurch verursacht, dass die Verbindung beim Abschluss des ersten Skripts zerstört wird. um zu vermeiden, dass Sie für jedes Kind eine neue Verbindung erstellen können. Ich sehe, dass Sie die Standard-mysql_ * -Funktionen verwenden, also stellen Sie sicher, dass Sie den 4. Parameter übergeben, um sicherzustellen, dass Sie jedes Mal einen neuen Link erstellen. Überprüfen Sie auch die maximale Anzahl der gleichzeitigen Verbindungen auf Ihrem Server

+0

Das ist, was ich bin - ich werde Ihren Link sehen, danke. – Clarkey

+0

@MattClarke ok, ich bin froh, dass Sie es nützlich finden .. Sie müssen die Gabel in der Iteration ausführen, wo Sie die Ergebnisse erhalten und ping die Website, wenn Sie im Kind sind oder weiter, wenn Sie in der Eltern sind – mishu

+0

I ' Ich folge nicht dem, was du sagst - dieses Gabelgeschäft ist für mich völlig neu, ich wusste nicht einmal, dass es möglich ist. – Clarkey