Время ожидания операции php cURL истекло через 120308 миллисекунд с полученным X из -1 байтов

Я иногда сталкиваюсь с этой ошибкой (см. Заголовок) в своем скрипте очистки.

X — целое число байтов > 0, реальное количество байтов, отправленных веб-сервером в ответ. Я отладил эту проблему с прокси-сервером Charles, и вот что я вижу

Сеанс отладки Чарльза с проблемным запросом

Как видите заголовка Content-Length: в ответе нет, а прокси все еще ждет данных (так вот cURL подождал 2 минуты и сдался)

Код ошибки cURL — 28.

Ниже приведена некоторая отладочная информация из подробного вывода curl с var_export'ed curl_getinfo() этого запроса:

* About to connect() to proxy 127.0.0.1 port 8888 (#584)
*   Trying 127.0.0.1...
* Adding handle: conn: 0x2f14d58
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 584 (0x2f14d58) send_pipe: 1, recv_pipe: 0
* Connected to 127.0.0.1 (127.0.0.1) port 8888 (#584)
> GET http://bakersfield.craigslist.org/sof/3834062623.html HTTP/1.0
User-Agent: Firefox (WindowsXP) Ц Mozilla/5.1 (Windows; U; Windows NT 5.1; en-GB
; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
Host: bakersfield.craigslist.org
Accept: */*
Referer: http://bakersfield.craigslist.org/sof/3834062623.html
Proxy-Connection: Keep-Alive

< HTTP/1.1 200 OK
< Cache-Control: max-age=300, public
< Last-Modified: Thu, 11 Jul 2013 21:50:17 GMT
< Date: Thu, 11 Jul 2013 21:50:17 GMT
< Vary: Accept-Encoding
< Content-Type: text/html; charset=iso-8859-1
< X-MCP-Cache-Control: max-age=2592000, public
< X-Frame-Options: SAMEORIGIN
* Server Apache is not blacklisted
< Server: Apache
< Expires: Thu, 11 Jul 2013 21:55:17 GMT
* HTTP/1.1 proxy connection set close!
< Proxy-Connection: Close
<
* Operation timed out after 120308 milliseconds with 4636 out of -1 bytes receiv
ed
* Closing connection 584
Curl error: 28 Operation timed out after 120308 milliseconds with 4636 out of -1
 bytes received http://bakersfield.craigslist.org/sof/3834062623.htmlarray (
  'url' => 'http://bakersfield.craigslist.org/sof/3834062623.html',
  'content_type' => 'text/html; charset=iso-8859-1',
  'http_code' => 200,
  'header_size' => 362,
  'request_size' => 337,
  'filetime' => -1,
  'ssl_verify_result' => 0,
  'redirect_count' => 0,
  'total_time' => 120.308,
  'namelookup_time' => 0,
  'connect_time' => 0,
  'pretransfer_time' => 0,
  'size_upload' => 0,
  'size_download' => 4636,
  'speed_download' => 38,
  'speed_upload' => 0,
  'download_content_length' => -1,
  'upload_content_length' => 0,
  'starttransfer_time' => 2.293,
  'redirect_time' => 0,
  'certinfo' =>
  array (
  ),
  'primary_ip' => '127.0.0.1',
  'primary_port' => 8888,
  'local_ip' => '127.0.0.1',
  'local_port' => 63024,
  'redirect_url' => '',
)

Могу ли я сделать что-то вроде добавления параметра curl, чтобы избежать этих тайм-аутов. И это не тайм-аут соединения и не тайм-аут ожидания данных — обе эти настройки не работают, так как curl на самом деле успешно подключается и получает какие-то данные, поэтому тайм-аут в ошибке всегда ~= 120000 мс.


person Alexey    schedule 12.07.2013    source источник


Ответы (2)


Я заметил, что вы пытаетесь проанализировать Craigslist; может это их защита от потопа? Проблема сохраняется, если вы пытаетесь проанализировать другой веб-сайт? Однажды у меня была такая же проблема, когда я пытался рекурсивно сопоставить FTP.

Что касается тайм-аутов, если вы уверены, что это не тайм-аут соединения и не тайм-аут ожидания данных (CURLOPT_CONNECTTIMEOUT/CURLOPT_TIMEOUT), я бы попробовал увеличить лимит самого PHP-скрипта:

set_time_limit(0);
person João Pereira    schedule 15.07.2013
comment
Привет, спасибо за ответ, но set_time_limit был там, параметры CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT изменены массивом параметров, переданным экземпляру класса оболочки curl, и параметр CURLOPT_TIMEOUT был там, когда я запускал предыдущие тесты, и я просто добавил параметр CURLOPT_CONNECTTIMEOUT в этот массив , проверил, был установлен дескриптор curl и перезапущен, но опять же, через 10-20 запросов та же проблема. - person Alexey; 17.07.2013
comment
Я все еще думаю, что это какой-то их антифлудовый механизм. Попробуйте сделать 1 запрос в секунду или меньше, посмотрите, произойдет ли это. - person João Pereira; 17.07.2013
comment
Вы пытались подключиться к нему другим способом, например, через telnet? Может быть, у вас будет еще какая-то информация. - person David Level; 17.07.2013
comment
Кстати, условия использования Craisglist прямо запрещают поисковые роботы. - person João Pereira; 18.07.2013
comment
Спасибо Хэл, это не мой проект/идея. Я собираюсь присудить это вам, поскольку это единственный ответ. Попробую добавить спящий вызов, но теперь и с этим глюком более-менее работает, так что на эти сбои просто уходит 2 минуты, потом продолжается как обычно, а их не так уж и много, если работает 24/7 - person Alexey; 21.07.2013
comment
Спасибо. Мне жаль, что я не мог помочь больше. - person João Pereira; 22.07.2013

Попробуйте увеличить default_socket_timeout в файле конфигурации PHP php.ini (например, ~/php.ini), например.

default_socket_timeout = 300

или установите его через curl в коде PHP как:

curl_setopt($res, CURLOPT_TIMEOUT, 300);

где $res — ваша существующая переменная ресурса.

person kenorb    schedule 04.03.2016