2013-04-29 13 views
5

OK, więc mam skrypt PHP, który ładuje inną stronę przy użyciu file_get_contents().PHP Stop skrypt file_get_contents() po 2 sekundach

Druga strona zajmuje około 30 sekund, aby załadować (typ skryptu to jest), a wszystko, czego potrzebuję, to file_get_contents(), aby zainicjować ten skrypt.

Problem polega na tym, że file_get_contents() będzie ładowany przez całe 30 sekund. Jedynym sposobem, aby to zatrzymać, jest zamknięcie karty (podczas zamykania karty uruchamiany skrypt nadal działa).

Jak mogę to zrobić, aby file_get_contents(); zamknął się po powiedzeniu 2 sekund?

góry dzięki

+3

Dlaczego warto używać file_get_contents()? Jeśli po prostu używasz go do uruchomienia innego skryptu, po prostu użyj curl i przekieruj wyjście curla do wartości null. Lub usuń dane wyjściowe z drugiego skryptu i wstaw wartość ignore_user_abort (true); na drugim skrypcie w ten sposób będzie działał nawet jeśli anulujesz/przerwiesz etc poprzednie polecenie. Ponieważ php jest językiem od góry do dołu, następny proces zawsze czeka na zakończenie poprzedniego procesu, więc plik file_get_contents() zawsze musi zostać ukończony, zanim będzie mógł przejść dalej. – Dave

+3

Sprawdź [to] (http://www.php.net/manual/en/function.file-get-contents.php#82527) – HamZa

+1

Bardzo dziękuję HamZa :) – Anim8r

Odpowiedz

3

Nie mogę odpowiedzieć na to pytanie, ale ja polecam korzystania cURL zamiast file_get_contents.

Przykład:

function get_url_contents($url) { 
    $crl = curl_init(); 

    curl_setopt($crl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'); 
    curl_setopt($crl, CURLOPT_URL, $url); 
    curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($crl, CURLOPT_CONNECTTIMEOUT, 5); 

    $ret = curl_exec($crl); 
    curl_close($crl); 
    return $ret; 
} 

Twój problem może być z timeout: default_socket_timeout

Ale to nie wydaje się logicznie bo 2 sekundy to naprawdę bardzo mało i nie mogę wytłumaczyć, dlaczego ktoś miałby zmień go na 2 sekundy. Wartość domyślna to 60 sekund.

+0

Dodałbym również CURLOPT_FOLLOWLOCATION. –

+0

Tak, OP może dodać to, co chce. To jest minimalny, którego używam do rozszerzenia Google Chrome. Na przykład zdałem sobie sprawę, że bez ustawienia "User Agent" niektóre strony internetowe w ogóle nie zwracają danych. – enenen

0

może być używana funkcja set_time_limit(2) przed wywołaniem funkcji file_get_contents.

+1

'set_time_limit' ustawi maksymalny limit czasu wykonania całego skryptu, nie tylko blok kodu lub funkcji, który może przerwać wykonywanie skryptu, jeśli był duży lub w środowisku o dużym obciążeniu, gdy nie został przekroczony odpowiedni limit czasu wykonania zestaw. – SIFE

1

W manual page widzimy, że file_get_contents() akceptuje trzeci argument o nazwie $context, gdy jesteśmy w stanie dopracować nasze opcje. Po kilka linków z tam dotrzemy HTTP context options gdzie timeout wydaje się być nasz człowiek:

Timeout pływak

Read timeout in seconds, specified by a float (e.g. 10.5). 

By default the default_socket_timeout setting is used. 

Więc można albo zapewnić kontekst lub zmienić default_socket_timeout (pierwsza opcja wygląda mniej skłonny do łamania innych rzeczy).

Nota prawna: Nie testowałem tego.

Powiązane problemy