File_get_contents () tem uma configuração de tempo limite?


152

Estou chamando uma série de links usando o file_get_contents()método em um loop. Cada link pode levar mais de 15 minutos para ser processado. Agora, me preocupo se o PHP file_get_contents()tem um período de tempo limite?

Se sim, o tempo limite será excedido com uma chamada e passará para o próximo link. Não quero ligar para o próximo link sem o término anterior.

Então, diga-me se file_get_contents()tem um período de tempo limite. O arquivo que contém o file_get_contents()é definido set_time_limit()como zero (ilimitado).



Eu experimentei o mesmo comportamento (tempo limite ao consultar a URL no mesmo "servidor") dentro de um projeto PHP do Visual Studio que usa as extensões PHP Tools for Visual Studio. Mais informações aqui .
Uwe Keim

Isso acontece também ao usar o servidor PHP embutido para consultar uma URL no mesmo site , porque é um servidor Web de thread único.
Uwe Keim

Respostas:


297

O tempo limite padrão é definido pela default_socket_timeoutconfiguração ini , que é de 60 segundos. Você também pode alterá-lo rapidamente:

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

Outra maneira de definir um tempo limite seria usá-lo stream_context_createpara definir o tempo limite como opções de contexto HTTP do wrapper de fluxo HTTP em uso:

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

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

8
Você pode fornecer informações sobre como definir o tempo limite para o URL https?
Vinay

11
essa coisa não está funcionando perfeitamente, se o seu valor é 1200, na verdade é 2400. Acabei de testar.
26413 TomSawyer

15
default_socket_timeout, stream_set_timeout e stream_context_create timeout são o tempo limite de cada linha de leitura / gravação, não o tempo limite da conexão inteira.
precisa saber é o seguinte

32

Como o @diyism mencionou, " default_socket_timeout, stream_set_timeout e stream_context_create timeout são o tempo limite de cada linha de leitura / gravação, não o tempo limite total da conexão " . E a principal resposta de @stewe me falhou.

Como alternativa ao uso file_get_contents, você sempre pode usar curlcom um tempo limite.

Então, aqui está um código funcional que funciona para chamar links.

$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_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

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

1
Essa resposta dá uma outra abordagem para controlar o tempo limite de conexão (usando fsockopenem vez de curl): stackoverflow.com/a/3690321/1869825
stevo

2
você deve definir CURLOPT_CONNECTTIMEOUT e CURLOPT_TIMEOUT em ondulação. Veja stackoverflow.com/a/27776164/1863432
bhelm

2
Não é uma resposta válida, a pergunta é para "file_get_contents". A resposta é ótima, mas inadequada.
e-info128

8

Sim! Ao passar um contexto de fluxo no terceiro parâmetro:

Aqui com um tempo limite de 1s :

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

Fonte na seção de comentários de https://www.php.net/manual/en/function.file-get-contents.php

Opções de contexto HTTP :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

Outros contextos: https://www.php.net/manual/en/context.php


1
A resposta com 286 repetições não funcionou, mas a sua funcionou :)
VE7JRO 17/02

O tempo limite fornecido stream_context_createapenas funciona para o tempo limite da conexão. Se o servidor responder (enviar alguns dados) dentro do tempo limite especificado, mas levar uma eternidade para enviar o restante de sua carga, esse tempo limite não interromperá a transferência lenta.
z80crew 22/04

6

Vale ressaltar que, se alterar o default_socket_timeout em tempo real, pode ser útil restaurar seu valor após a chamada de file_get_contents :

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

1
mas você sabe que ini_set não define as coisas permanentemente, certo? então basicamente 4 metade do seu script é inútil #
Flash Thunder

2
@FlashThunder Não se houver outra chamada para file_get_contents posteriormente no código que requer o tempo limite anterior. Restaurar configurações alteradas em tempo real para um bit específico de código após a execução do código é geralmente uma boa prática.
Leigh Bicknell

1
@FlashThunder é uma boa prática restaurar o valor de socket_timeout após uma chamada, para que as chamadas subsequentes para a mesma função na mesma execução de script usem configurações globais.
Pascal Roget

1

Para mim, trabalho quando altero meu php.ini no meu host:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.