2013-10-09 18 views
8

cURL lässt PHP einen Fatal Error auslösen, wenn es länger als 30 Sekunden dauert, um eine Antwort vom Server zu erhalten. Dies scheint in meiner Web-App viel zu passieren, besonders wenn der andere Server beschäftigt ist. Es ist wirklich nicht schön für den Benutzer, das zu sehen.cURL Timeout, können Sie elegant damit umgehen?

Ich möchte entweder die Zeitüberschreitung abfangen und selbst eine nette Nachricht anzeigen, oder alternativ fragte ich mich, ob es eine Möglichkeit gäbe, mit dem Rest des PHP-Skripts fortzufahren, wie der Rest dieses Skripts sogar ausführen kann wenn es keine Antwort vom Server gibt (mit Standardwerten).

Ich sehe nicht wirklich, warum cURL einen fatalen Fehler anstelle einer Warnung für die Auszeit werfen würde, um ehrlich zu sein. Es ist ein echter Schmerz.

Antwort

5

die cURL Timeout erhöhen diese params

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 500); 

mit Da Sie 30 Sekunden erwähnt, ich vermute, dass Ihre PHP-Script Timeout aus ausgeführt wird. Fügen Sie das Ihrem PHP-Code hinzu.

set_time_limit(0);// 0 is infite limit 
+0

Aha danke dafür. Als PHP-Neuling war mir nicht bewusst, dass PHP selbst maximal 30 Sekunden für die Ausführung eines Skripts erlaubte. Ich dachte, der fatale Fehler würde durch Curl ausgelöst. Danke dafür, es hilft, aber es ist nicht wirklich die Lösung, auf die ich gehofft hatte. – Juicy

+1

Sicher, erhöhen Sie die time_limit in die Unendlichkeit bei der Entwicklung, aber das ist eine schreckliche Idee für die Produktion. – coderama

+0

Diese Antwort sagt Ihnen nicht, wie Sie den Fehler finden (was ich suche), es sagt Ihnen nur, wie Sie den Fehler vermeiden können. Ist es sogar möglich, die Zeit für eine curl_exec zu begrenzen, ohne diese Einstellung zu verwenden? – cesoid

4

Dies ist eine etwas wörtlichere Antwort auf die Frage. Das heißt, Curl wird nach 30 Sekunden immer noch anhalten, aber Sie können den Fehler abfangen und weitermachen, wenn Sie möchten.

ini_set('max_execution_time', 40); // prevents 30 seconds from being fatal 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_TIMEOUT, 30); // curl timeout remains at 30 seconds 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 
curl_exec($ch); 

if ($error_number = curl_errno($ch)) { 
    if (in_array($error_number, array(CURLE_OPERATION_TIMEDOUT, CURLE_OPERATION_TIMEOUTED))) { 
     print "curl timed out"; 
    } 
} 

curl_close($ch); 

Wenn Sie keine Kontrolle über die max_execution_time haben, können Sie nur ein wenig die Locke Timeout senken.

Verwandte Themen