Wzywam serię linków przy użyciu file_get_contents()
metody w pętli. Przetworzenie każdego łącza może zająć więcej niż 15 minut. Teraz martwię się, czy PHP file_get_contents()
ma limit czasu?
Jeśli tak, wygaśnie połączenie i przejdzie do następnego łącza. Nie chcę wywoływać następnego łącza bez zakończenia poprzedniego.
Więc proszę powiedz mi, czy file_get_contents()
ma limit czasu. Plik zawierający element file_get_contents()
jest ustawiony set_time_limit()
na zero (nieograniczony).
php
timeout
file-get-contents
Flora Clinton
źródło
źródło
Odpowiedzi:
Domyślny limit czasu jest definiowany przez
default_socket_timeout
ustawienie ini , które wynosi 60 sekund. Możesz także zmienić to w locie:Innym sposobem, aby ustawić limit czasu, byłoby użyć
stream_context_create
, aby ustawić limit czasu jako opcji kontekstowych HTTP na owijki strumienia HTTP w użyciu:źródło
Jak wspomniano w @diyism, „ default_socket_timeout, stream_set_timeout i stream_context_create timeout to cały limit czasu dla każdego wiersza odczytu / zapisu, a nie całego limitu czasu połączenia. ” A najlepsza odpowiedź @stewe mnie zawiodła.
Zamiast używać
file_get_contents
, zawsze możesz użyćcurl
z limitem czasu.Oto działający kod, który działa do wywoływania linków.
źródło
fsockopen
zamiastcurl
): stackoverflow.com/a/3690321/1869825Tak! Przekazując kontekst strumienia w trzecim parametrze:
Tutaj z limitem czasu wynoszącym 1 s :
Źródło w sekcji komentarzy na https://www.php.net/manual/en/function.file-get-contents.php
Opcje kontekstu HTTP :
Inne konteksty: https://www.php.net/manual/en/context.php
źródło
stream_context_create
działa tylko dla limitu czasu połączenia. Jeśli serwer odpowie (wysyła pewne dane) w określonym czasie, ale wysłanie reszty ładunku trwa wiecznie, ten limit czasu nie przerywa powolnego przesyłania.Warto zauważyć, że jeśli zmieniasz default_socket_timeout w locie, przydatne może być przywrócenie jego wartości po wywołaniu file_get_contents :
źródło
Dla mnie działa, kiedy zmieniam php.ini na moim hoście:
źródło