Uruchamiam żądanie curl w bazie danych eXist przez php. Zestaw danych jest bardzo duży, w wyniku czego baza danych konsekwentnie zajmuje dużo czasu, aby zwrócić odpowiedź XML. Aby to naprawić, skonfigurowaliśmy żądanie zwijania, którego czas oczekiwania powinien być długi.
$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);
Jednak żądanie zwijania konsekwentnie kończy się przed zakończeniem żądania (<1000, gdy jest wymagane przez przeglądarkę). Czy ktoś wie, czy jest to właściwy sposób na ustawienie limitów czasu w zwijaniu?
set_time_limit(0);
jeśli skrypt działa na konsoli.php -d max_execution_time=1 -r 'while(true){$r=1*1;}'
lub obserwuj w akcji, że cli nie ma magicznej flagi „zawsze nieograniczona”.set_time_limit(0)
jeśli nie używasz go w pętli.Hmm, wydaje mi się, że
CURLOPT_TIMEOUT
określa czas, jaki może zająć wykonanie dowolnej funkcji cURL. Myślę, żeCURLOPT_CONNECTTIMEOUT
zamiast tego powinieneś na to patrzeć , ponieważ oznacza to, że cURL określa maksymalny czas oczekiwania na zakończenie połączenia.źródło
CURLOPT_TIMEOUT
o tym, jak długo trwa ta funkcja, bazowe dokumenty biblioteki curl wydają się mówić, jak długo trwa to żądanie, co jest ciekawym rozróżnieniem - nie jestem pewien, w jaki sposób to przeczytać!Jest to dziwactwo, które może być istotne dla niektórych osób ... Z komentarzy doktorów PHP.
Od http://www.php.net/manual/en/function.curl-setopt.php#104597
źródło
Twój kod ustawia limit czasu na 1000 sekund . Dla milisekund użyj
CURLOPT_TIMEOUT_MS
.źródło
Musisz upewnić się co do limitów czasu między tobą a plikiem. W tym przypadku PHP i Curl.
Aby powiedzieć Curlowi, aby nigdy nie przekraczał limitu czasu, gdy transfer jest nadal aktywny, musisz ustawić
CURLOPT_TIMEOUT
na0
zamiast1000
.W PHP ponownie musisz usunąć limity czasowe, w przeciwnym razie PHP (domyślnie po 30 sekundach) zabije skrypt zgodnie z żądaniem Curl. To samo powinno rozwiązać problem .
Ponadto, jeśli potrzebujesz integralności danych, możesz dodać warstwę bezpieczeństwa, używając
ignore_user_abort
:Rozłączenie klienta przerwie wykonywanie skryptu i może spowodować uszkodzenie danych,
np. nieprzejściowe zapytanie do bazy danych, budowanie pliku konfiguracyjnego itd., podczas gdy w twoim przypadku pobierałby plik częściowy ... i możesz się tym przejmować lub nie.
Odpowiadając na to stare pytanie, ponieważ ten wątek znajduje się na górze wyszukiwanych haseł
CURL_TIMEOUT
.źródło
Nie można uruchomić żądania z przeglądarki, upłynie limit czasu oczekiwania na odpowiedź serwera z uruchomionym żądaniem CURL. Limit czasu przeglądarki prawdopodobnie upłynie za 1-2 minuty, co jest domyślnym limitem czasu sieci.
Musisz uruchomić go z wiersza poleceń / terminala.
źródło
Jeśli używasz PHP jako aplikacji fastCGI, sprawdź ustawienia limitu czasu fastCGI. Zobacz: PHP curl wstaw błąd 500
źródło