Установка таймаута Curl в PHP

Я запускаю запрос curl в базе данных eXist через php. Набор данных очень велик, и в результате база данных последовательно занимает много времени, чтобы вернуть ответ XML. Чтобы исправить это, мы установили запрос на завивание, с тем, что должно быть длинным таймаутом.

$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); 

Однако запрос на завивание последовательно заканчивается до завершения запроса (<1000 при запросе через браузер). Кто-нибудь знает, если это правильный способ установить таймауты в curl?

См. Документацию: http://www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT – количество секунд ожидания при попытке подключения. Используйте 0, чтобы ждать бесконечно.
CURLOPT_TIMEOUT – максимальное количество секунд для выполнения функций cURL.

 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds 

также не забудьте увеличить время выполнения скрипта php:

 set_time_limit(0);// to infinity for example 

Хм, мне кажется, что CURLOPT_TIMEOUT определяет количество времени, которое может выполнять любая функция cURL для выполнения. Я думаю, вы действительно должны смотреть на CURLOPT_CONNECTTIMEOUT , так как это сообщает cURL о максимальном времени ожидания завершения соединения.

Ваш код устанавливает тайм-аут до 1000 секунд . Для миллисекунд используйте CURLOPT_TIMEOUT_MS .

Есть причуда с этим, что может быть актуально для некоторых людей … Из комментариев к документам PHP.

Если вы хотите, чтобы cURL был тайм-аут менее чем за одну секунду, вы можете использовать CURLOPT_TIMEOUT_MS , хотя в «Unix-подобных системах» есть ошибка / «функция», что приводит к немедленному отключению libcurl, если значение <1000 мс с ошибкой " cURL Ошибка (28): время ожидания достигнуто ». Объяснение этого поведения:

«Если libcurl построен для использования стандартного распознавателя системного имени, эта часть передачи по-прежнему будет использовать полноразмерное разрешение для тайм-аутов с минимальным временем ожидания, разрешенным на одну секунду».

Это означает, что разработчики PHP: «Вы не можете использовать эту функцию, не тестируя ее сначала, потому что вы не можете определить, использует ли libcurl стандартное системное имя resolver (но вы можете быть уверены, что это так)»

Проблема в том, что на (Li | U) nix, когда libcurl использует стандартный распознаватель имен, SIGALRM возникает во время разрешения имени, которое, по мнению libcurl, является сигналом тайм-аута.

Решение состоит в отключении сигналов с использованием CURLOPT_NOSIGNAL. Вот пример скрипта, который просит себя вызвать 10-секундную задержку, чтобы вы могли протестировать таймауты:

 <?php if (!isset($_GET['foo'])) { // Client $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); $data = curl_exec($ch); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); if ($curl_errno > 0) { echo "cURL Error ($curl_errno): $curl_error\n"; } else { echo "Data received: $data\n"; } } else { // Server sleep(10); echo "Done."; } ?> 

С http://www.php.net/manual/en/function.curl-setopt.php#104597

Вы не можете запустить запрос из браузера, он будет ждать, пока сервер, на который запросит запрос CURL, не ответит. Вероятно, браузер отключается через 1-2 минуты, по умолчанию – сетевой тайм-аут.

Вам нужно запустить его из командной строки / терминала.

Вам нужно будет убедиться в таймаутах между вами и файлом. В этом случае PHP и Curl.

Чтобы сообщить Curl о том, что никогда не будет тайм-аут, когда передача еще активна, вам нужно установить CURLOPT_TIMEOUT 0 вместо 1000 .

 curl_setopt($ch, CURLOPT_TIMEOUT, 0); 

В PHP, опять же, вы должны удалить временные рамки или PHP самостоятельно (через 30 секунд по умолчанию) убьет скрипт по запросу Curl. Это само по себе должно решить вашу проблему .
Кроме того, если вам нужна целостность данных, вы можете добавить уровень безопасности с помощью ignore_user_abort :

 # The maximum execution time, in seconds. If set to zero, no time limit is imposed. set_time_limit(0); # Make sure to keep alive the script when a client disconnect. ignore_user_abort(true); 

Отключение клиента прерывает выполнение сценария и, возможно, повреждает данные,
например. запрос на непереходную базу данных, создание файла конфигурации, ecc., в то время как в вашем случае он будет загружать частичный файл … и вы могли бы или нет заботиться об этом.

Отвечая на этот старый вопрос, потому что этот поток в верхней части движка ищет CURL_TIMEOUT .

Если вы используете PHP в качестве приложения fastCGI, убедитесь, что вы проверяете настройки таймаута FastCGI. См. PHP curl put 500 error