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

Иногда я испытываю эту ошибку (см. Раздел) в моем скрипте скремблирования.

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

Отладочная сессия Чарльза с проблемным запросом

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

Код ошибки cURL равен 28.

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

* 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, чтобы избежать этих тайм-аутов. И это не таймаут соединения, ни тайм-аут ожидания данных – обе эти настройки не работают, поскольку завиток действительно успешно соединяется и получает некоторые данные, поэтому тайм-аут в ошибке всегда равен ~ 120000 мс.

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

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

 set_time_limit(0); 

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

 default_socket_timeout = 300 

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

 curl_setopt($res, CURLOPT_TIMEOUT, 300); 

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