2013-10-09 17 views
8

cURL fa in modo che PHP lanci un errore irreversibile se impiega più di 30 secondi per ottenere una risposta dal server. Questo sembra accadere molto nella mia app web, in particolare se l'altro server è occupato. Non è davvero carino per l'utente vederlo.timeout di cURL, puoi gestirlo in modo elegante?

Mi piacerebbe prendere il timeout e visualizzare un bel messsage personalmente o, in alternativa, mi chiedevo se c'era un modo per continuare con il resto dello script PHP, poiché il resto dello script può essere eseguito anche se non c'è risposta dal server (con valori predefiniti).

Non vedo davvero perché CURL avrebbe lanciato un errore irreversibile invece di un avviso per il timeout a essere onesti. È un vero dolore.

risposta

5

aumentare il timeout cURL utilizzando questi params

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

Dal momento che lei ha citato 30 secondi, ho il sospetto che il timeout script PHP si sta esaurendo. Quindi aggiungi questo al tuo codice PHP.

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

Aha, grazie per quello. Essendo abbastanza nuovo per PHP non ero consapevole del fatto che fosse lo stesso PHP che consentiva un massimo di 30 secondi per l'esecuzione di uno script. Pensavo che l'errore fatale venisse lanciato da un ricciolo. Grazie per questo, aiuta ma non è davvero la soluzione che speravo. – Juicy

+1

Certo, aumenta il time_limit all'infinito durante lo sviluppo, ma questa è una pessima idea per la produzione. – coderama

+0

Questa risposta non ti dice come rilevare l'errore (che è quello che sto cercando), ti dice semplicemente come evitare l'errore. È persino possibile limitare il tempo per un curl_exec senza utilizzare quell'impostazione? – cesoid

4

Questa è una risposta un po 'più letterale alla domanda. Cioè, il ricciolo si fermerà ancora dopo 30 secondi, ma puoi prendere l'errore e andare avanti se vuoi.

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

Se si dispone di alcun controllo sulla max_execution_time, si può semplicemente abbassare il timeout ricciolo un po '.

Problemi correlati