File_get_contents () zaman aşımı ayarına sahip mi?


152

file_get_contents()Bir döngüde yöntemi kullanarak bağlantılar bir dizi arıyorum . Her bağlantının işlenmesi 15 dakikadan fazla sürebilir. Şimdi, PHP'nin file_get_contents()bir zaman aşımı süresi olup olmadığı konusunda endişeleniyorum ?

Evetse, bir çağrı ile zaman aşımına uğrayacak ve bir sonraki bağlantıya geçecektir. Öncekini bitirmeden bir sonraki bağlantıyı aramak istemiyorum.

Bu yüzden lütfen bana file_get_contents()zaman aşımı süresinin olup olmadığını söyleyin . İçeren dosya sıfıra (sınırsız) file_get_contents()ayarlanır set_time_limit().



Visual Studio uzantıları için PHP Araçları kullanan bir Visual Studio PHP projesi içinde aynı davranış (aynı "sunucuda URL sorgulama zaman aşımı) yaşadım. Daha fazla bilgi burada .
Uwe Keim

Bu , aynı web sitesindeki bir URL'yi sorgulamak için yerleşik PHP sunucusunu kullanırken de olur , çünkü tek iş parçacıklı bir web sunucusudur.
Uwe Keim

Yanıtlar:


299

Varsayılan zaman aşımı , 60 saniye olan default_socket_timeoutini ayarı ile tanımlanır . Ayrıca anında değiştirebilirsiniz:

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

Bir zaman aşımı ayarlamak için başka bir yolu da, kullanmak olacaktır stream_context_createolarak zaman aşımı ayarlamak için HTTP bağlamı seçenekleri arasında HTTP akışı ambalajında kullanımda:

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

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

8
Https url'si için zaman aşımı süresini ayarlama hakkında bilgi verebilir misiniz?
Vinay

11
Bu şey mükemmel çalışmıyor, eğer değeriniz 1200 ise, aslında 2400. Ben sadece test ediyorum.
TomSawyer

15
default_socket_timeout, stream_set_timeout ve stream_context_create zaman aşımı, tüm bağlantı zaman aşımı değil, okunan / yazılan her satırın zaman aşımıdır.
diyizm

32

@ Diyottan da bahsedildiği gibi, " default_socket_timeout, stream_set_timeout ve stream_context_create zaman aşımı, tüm bağlantı zaman aşımı değil, okunan / yazılan her satırın zaman aşımıdır."

Kullanmaya alternatif olarak file_get_contents, her zaman curlbir zaman aşımı ile kullanabilirsiniz .

İşte bağlantılar çağırmak için çalışan bir çalışma kodu.

$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
Bu cevap, bağlantı zaman aşımını kontrol etmek için başka bir yaklaşım sunuyor ( fsockopenyerine curl): stackoverflow.com/a/3690321/1869825
stevo

2
kıvrımda hem CURLOPT_CONNECTTIMEOUT hem de CURLOPT_TIMEOUT değerlerini ayarlamanız gerekir. Bkz. Stackoverflow.com/a/27776164/1863432
bhelm

2
Geçerli bir yanıt değil, soru "file_get_contents" içindir. Yanıt harika ama uygun değil.
e-info128

8

Evet! Üçüncü parametrede bir akış bağlamı ileterek :

Burada 1 saniyelik bir zaman aşımı ile :

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

Https://www.php.net/manual/en/function.file-get-contents.php adresinin yorum bölümündeki kaynak

HTTP bağlamı seçenekleri :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

Diğer bağlamlar: https://www.php.net/manual/en/context.php


1
286 temsilcisi ile cevap işe yaramadı, ama seninki :)
VE7JRO

Verilen zaman aşımı stream_context_createyalnızca bağlantı zaman aşımı için geçerlidir. Sunucu, verilen zaman aşımı süresi içinde yanıtlarsa (bazı veriler gönderir), ancak yükünün geri kalanını geri göndermek sonsuza dek sürerse, bu zaman aşımı yavaş aktarımı kesintiye uğratmaz.
z80crew

6

Anında default_socket_timeout değiştirilirse , file_get_contents çağrınızdan sonra değerini geri yüklemenin yararlı olabileceğini belirtmek gerekir :

$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
ama ini_set'in işleri kalıcı olarak ayarlamadığını biliyorsunuz, değil mi? temel olarak betiğinizin 4 yarısı işe yaramaz
Flash Thunder

2
@FlashThunder Daha önceki zaman aşımı gerektiren kodda file_get_contents için başka bir çağrı varsa değil. Bu kod yürütüldükten sonra belirli bir kod biti için anında değiştirilen ayarları geri yüklemek genellikle iyi bir uygulamadır.
Leigh Bicknell

1
@FlashThunder, bir çağrıdan sonra socket_timeout değerini geri yüklemek iyi bir uygulamadır, böylece aynı kod yürütmesinde aynı işleve daha sonra yapılan çağrılar genel ayarları kullanır.
Pascal Roget

1

Benim ev sahibi benim php.ini değiştirmek zaman benim için çalışmak:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.