2012-04-16 14 views
7

Buduję aplikację, która w pewnym momencie zwija zawartość z zewnętrznego adresu URL. Jak dotąd to zawsze kończyło się dość szybko/natychmiastowo. Jednak nie jestem pewien, co by się stało, gdyby serwer zewnętrzny długo nie odpowiadał. Czy PHP czekałoby na wykonanie następującego kodu, dopóki cURL nie zostanie zakończony?PHP: Czy cURL zakończy działanie w tle, czy zablokuje dalsze wykonywanie skryptu?

Nie mogę tego przetestować, ponieważ nie wiem, jak "symulować" wolniejszą odpowiedź. Mam nadzieję, że to pseudo-kod sprawia, że ​​moje pytanie jest jasne:

$ch = curl_init($some_remote_url); 
$fp = fopen($some_local_file, 'wb'); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_exec($ch); // Let's say this takes 20 seconds until the other server responds 
curl_close($ch); 
fclose($fp); 
redirect($some_other_url); // Will this be executed instantly or only after 20 seconds? 

Powodem zastanawiam się o to, że nie chcę, aby moje użytkownikowi patrzeć na stronie „loading” przez 20 sekund w przypadku serwera zdalnego reagował powoli, więc prawdopodobnie musiałbym przenieść cały proces do zadania crona. Użytkownik nie potrzebuje natychmiastowego wyniku curlingu, więc nie ma to dla niego znaczenia po zakończeniu procesu.

+0

+1 ładne pytanie ... zdecydowanie po 20sek – Baba

Odpowiedz

4

Curl zablokuje wykonanie. Jeśli chcesz pobrać plik w tle (asynchronicznie), albo użyć crona zaplanowane zadania, lub exec polecenie tak:

system("wget URL &"); 
+0

O ile mi wiadomo, przy użyciu system() lub exec() nie zachowuje się inaczej niż zadania synchroniczne, takie jak regularne cURL, ale robi to passthru(). Niestety, wszystkie te trzy funkcje są wyłączone na większości hostowanych serwerów, ze względów bezpieczeństwa. – ddlab

0

Nie wiem, czy to zatrzymałoby wykonywanie skryptu, ale można utworzyć skrypt, który bezpośrednio renderuje dane wyjściowe na zdalny komputer, a następnie uruchamia za pośrednictwem AJAX drugi skrypt, aby wykonać żądaną akcję cURL. Na koniec zwróciłoby odpowiedź, a twój skrypt JS wykonałby wtedy przekierowanie lub coś, co chcesz.

Oczywiście działałoby to tylko dla użytkowników z włączonym JS, ale wystarczy powiedzieć: Każdy, kto nie ma włączonego JS w swojej przeglądarce, nie może normalnie przeglądać sieci.

Powiązane problemy