Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dwa razy dłuższy timeout dla file_get_contents z ustawionym kontekstem.
Forum PHP.pl > Forum > PHP
kreatiff
  1. 'http' => array('timeout' => 1)
  2. ));
  3. $zawartosc = file_get_contents('http://jakas.strona.ktora.dlugo.przetwarza.zapytanie.pl/jakies-dane-get', false, $kontekst);
Dlaczego timeout dla tego zapytania file_get_contents trwa de facto 2 sekundy, a nie 1?
nospor
A jak ustawisz timeout 10s to trwac bedzie 20? Raczej watpie. WIec to nie jest dwa razy dluzszy, a dluzszy o sekunde. A kurat tylko w tym specyficznym przypadku wydaje ci sie, ze jest dwa razy dluzszy wink.gif
A skad ta sekunda? A zanim doleci do tamtego pliku to moze trwa, a moze źle mierzysz, a może....
kreatiff
Sprawdzałem i na 10 sekundach i na 5, zawsze to samo. Czas 2x dłuższy + kilka dziesiątych/setnych.

Jakby ktoś chciał sprawdzić, to mój test polegał na próbie pobrania pliku o takiej zawartości kodem z pierwszego posta: test.php
  1. sleep(25);
  2. echo 'x';
Prawdopodobnie zatem timeout nie jest dla całego połączenia, tylko dla jakichś mechanizmów stosowanych przez file_get_contents. Tylko nie mogę znaleźc sensownego wytłumaczenia dlaczego tak i ewentualnie jakie to mechanizmy.
Pyton_000
Potwierdzam. Nawet znalazłem założony Ticket: https://bugs.php.net/bug.php?id=48280

Ustawiając
Kod
ini_set('default_socket_timeout', 2);

Jest ten sam efekt.
kreatiff
Hmm, czyli to nie błąd, a feature wink.gif
the value is used both for connection timeout, and then again for read timeout.

Nadal tego nie kumam, bo skoro nie udało się połączenie, to po co czekać na jakieś odczyty. Nie będę spamować supportu, a zapewne już gdzieś wyjaśnienie w detalach istnieje, skoro kwestia ta była podniesiona już lata temu.
Jakby ktoś znalazł, to proszę o linka, bo sam nie znalazłem poza podobnym pytaniem na stackoverflow, które też nie zostało wyjaśnione.
Pyton_000
Ale w Twoim przypadku zadziałały oba. Domyślam się że gdyby serwer rzucił np. "Time out" to wtedy drugi czyli "read timeout" nie odpaliłby się.
kreatiff
Ma to sens. Bo moje testy zakończyły się udanym połączeniem.

To teraz muszę gdzieś wynaleźć w sieci adres, który nic mi nie odpowie przez kilka sekund i na nim sprawdzić. Bo sam nie wiem jak to zasymulować.

edycja:
Rzeczywiście chyba jest tak jak piszesz Pyton_000, gdy żądanie bez odpowiedzi serwera trwa tę sekundę, skrypt zostaje przerwany po sekundzie.
Ale jak tylko serwer odpowie czas zaczyna być liczony od nowa (tzn. pewnie inny element zaczyna mieć liczony timeout). Wygląda to tak jakby timeout był liczony dla wielu różnych elementów (żądań? nie wiem, nie znam się na szczegółach połączeń sieciowych) osobno, bo udało mi się z jakimiś chińskimi adresami złapać timeout dopiero po 10+ sekundach od odpalenia skryptu, mimo tego, że był ustawiony na 1 sekundę w opcjach.
Czyli wiem już coś więcej, ale nadal nie wszystko.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.