2009-02-26 9 views
1

Hier ein kurzer Überblick, was ich tue, es ist eigentlich ganz einfach:Verbesserung cURL Performance (PHP Library)

  • Gehen Sie aus und holen Datensätze aus einer Datenbanktabelle.
  • Gehen Sie durch alle diese Datensätze und für jede Spalte, die eine URL enthält gehen Sie aus (mit cURL) und stellen Sie sicher, dass die URL noch gültig ist.
  • Für jeden Datensatz wird eine Spalte mit einem aktuellen Zeitstempel aktualisiert, der anzeigt, wann sie das letzte Mal überprüft wurde und eine andere db-Verarbeitung stattfindet.

Jedenfalls funktioniert das alles gut und gut und macht genau das, was es soll. Das Problem ist, dass ich denke, die Leistung könnte stark verbessert in Bezug darauf, wie ich die URLs mit cURL validieren. Hier

ist eine kurze (über vereinfachte) Auszug aus meinem Code, der zeigt, wie cURL verwendet wird:

$ch = curl_init(); 
while($dbo = pg_fetch_object($dbres)) 
{ 
    // for each iteration set url to db record url 
    curl_setopt($ch, CURLOPT_URL, $dbo->url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_exec($ch); // perform a cURL session 
    $ihttp_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); 
    // do checks on $ihttp_code and update db 
} 
// do other stuff here 
curl_close($ch); 

Wie man sehen kann ich gerade die Wiederverwendung der gleichen die ganze Zeit curl handhaben, aber auch wenn ich strip out über die gesamte Verarbeitung (Datenbank oder sonst) das Skript dauert immer noch unglaublich lange zu laufen. Würde das Ändern einer der cURL-Optionen die Leistung verbessern? Zeitüberschreitungswerte einstellen/etc? Jede Eingabe würde geschätzt werden.

Danke,

  • Nicholas

Antwort

9

Set CURLOPT_NOBODY bis 1 (siehe curl documentation) nicht für den Körper der Antwort tell kräuseln zu fragen. Dies wird den Webserver kontaktieren und eine HEAD-Anfrage ausgeben. Der Antwortcode teilt Ihnen mit, ob die URL gültig ist oder nicht und überträgt den Großteil der Daten nicht zurück.

Wenn das immer noch zu langsam ist, dann werden Sie wahrscheinlich eine enorme Verbesserung feststellen, wenn Sie N Threads (oder Prozesse) ausführen, die jeweils 1/5 der Arbeit ausführen. Der Engpass befindet sich möglicherweise nicht in Ihrem Code, sondern in den Antwortzeiten der Remote-Server. Wenn sie langsam reagieren, wird die Schleife langsam ausgeführt.

+1

Das Hinzufügen dieses Parameters half definitiv, die Ausführungszeit um 30-40% zu verkürzen - danke! –

+0

Schöne Idee, danke für den Beitrag! – Jay

+0

Wir können Multithreading hier nicht verwenden. Verwenden Sie multi_curl http://www.askapache.com/php/curl-multi-downloads.html – mixdev