2012-04-19 7 views
113

Sto chiamando una serie di collegamenti utilizzando il metodo file_get_contents() in un ciclo. Ogni collegamento può richiedere più di 15 minuti per l'elaborazione. Ora, mi preoccupo se lo file_get_contents() di PHP ha un periodo di timeout?Does file_get_contents() ha un'impostazione di timeout?

Se sì, si interrompe il timeout con una chiamata e passa al collegamento successivo. Non voglio chiamare il prossimo collegamento senza che il precedente finisca.

Quindi, per favore dimmi se file_get_contents() ha un periodo di timeout. Il file che contiene file_get_contents() è impostato su set_time_limit() su zero (illimitato).

+0

Rimando: [Gestione ritardi durante il recupero di file da un server remoto in PHP] (http://stackoverflow.com/q/1605063/367456) – hakre

+0

Ho riscontrato lo stesso comportamento (timeout durante la ricerca di URL sullo stesso "server") all'interno di un progetto PHP di Visual Studio che utilizza gli strumenti PHP per Visual Estensioni Studio. [Maggiori informazioni qui] (http://support.devsense.com/viewtopic.php?f=21&t=1916). –

+0

Ciò accade anche quando si utilizza il [server PHP integrato per interrogare un URL sullo stesso sito] (https://bugs.php.net/bug.php?id=63102), perché si tratta di un Web a thread singolo server. –

risposta

225

Il timeout predefinito è definito da default_socket_timeout ini-setting, che è di 60 secondi. È inoltre possibile modificare al volo:

ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes 

Un altro modo per impostare un timeout, sarebbe quella di utilizzare stream_context_create per impostare il timeout come HTTP context options della HTTP stream wrapper in uso:

$ctx = stream_context_create(array('http'=> 
    array(
     'timeout' => 1200, //1200 Seconds is 20 Minutes 
    ) 
)); 

echo file_get_contents('http://example.com/', false, $ctx); 
+6

Puoi fornire informazioni su come impostare il timeout per l'URL https? – Vinay

+8

questa cosa non funziona perfettamente, se il tuo valore è 1200, in realtà è 2400. l'ho appena testato. – TomSawyer

+13

default_socket_timeout, stream_set_timeout e stream_context_create timeout sono tutti i timeout di ogni riga di lettura/scrittura, non dell'intero timeout della connessione. – diyism

22

Come @diyism menzionato, "default_socket_timeout, stream_set_timeout e stream_context_create timeout sono tutti i timeout di ogni riga di lettura/scrittura, non dell'intero timeout della connessione." E la risposta più alta di @stewe mi ha fallito.

In alternativa all'utilizzo di file_get_contents, è sempre possibile utilizzare curl con un timeout.

Quindi ecco un codice funzionante che funziona per chiamare i collegamenti.

$url='http://example.com/'; 
$ch=curl_init(); 
$timeout=5; 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

$result=curl_exec($ch); 
curl_close($ch); 
echo $result; 
+1

Questa risposta fornisce un altro approccio per controllare il timeout della connessione (usando 'fsockopen' invece di' curl'): http://stackoverflow.com/a/3690321/1869825 – stevo

+1

si dovrebbe impostare sia CURLOPT_CONNECTTIMEOUT che CURLOPT_TIMEOUT in arricciatura. Vedi http://stackoverflow.com/a/27776164/1863432 – bhelm

1

Per me lavorare quando cambio il mio php.ini nel mio ospite:

; Default timeout for socket based streams (seconds) 
default_socket_timeout = 300 
3

Vale la pena notare che se la modifica default_socket_timeout al volo, potrebbe essere utile per ripristinare il suo valore dopo i vostri file_get_contents chiamata:

$default_socket_timeout = ini_get('default_socket_timeout'); 
.... 
ini_set('default_socket_timeout', 10); 
file_get_contents($url); 
... 
ini_set('default_socket_timeout', $default_socket_timeout);