cURL иногда возвращает пустую строку для действительного URL - PullRequest
4 голосов
/ 28 марта 2011

Я использую библиотеку roll-curl [https://github.com/LionsAd/rolling-curl]] для асинхронного извлечения контента из большого количества веб-ресурсов в рамках запланированной задачи. Библиотека позволяет вам установить максимальное количество одновременных соединений CURL, и я начал с 20, но позже поднялся до 50, чтобы увеличить скорость.

Кажется, что каждый раз, когда я запускаю его, произвольные URL из нескольких тысяч обрабатываемых просто терпят неудачу и возвращают пустую строку. Кажется, чем больше у меня одновременных соединений, тем больше неудачных запросов я получаю. Тот же URL-адрес, который не был выполнен один раз, может сработать при следующей попытке запустить функцию. Что может быть причиной этого, и как я могу избежать этого?

Ответы [ 2 ]

1 голос
/ 22 мая 2016

Все, что написал Люк Франкен, является точным, и его ответ привел меня к решению моей версии проблемы спрашивающего, а именно:

Удаленные серверы отвечают в соответствии со своими собственными, сильно изменяющимися графиками.Чтобы дать им достаточно времени для ответа, важно установить два параметра cURL, чтобы обеспечить либеральное количество времени.Это:

    CURLOPT_CONNECTTIMEOUT => 30
    CURLOPT_TIMEOUT => 30

Вы можете попробовать все больше и меньше времени, пока не найдете что-то, что минимизирует ошибки.Но если вы получаете прерывистые неполучения ответов с помощью curl / multi-curl / rollcurl, вы, вероятно, сможете решить большинство проблем следующим образом.

0 голосов
/ 02 февраля 2012

В общем, вы предполагаете, что этого не должно произойти.

В случае доступа к внешним серверам это не так. Ваш код должен быть полностью осведомлен о серверах, которые могут не отвечать, не отвечать вовремя или отвечать неправильно. В процессе HTTP допускается, что все может пойти не так. Если вы достигнете сервера, вы должны получить уведомление с помощью кода ошибки HTTP (хотя это не всегда происходит), но также проблемы с сетью могут привести к отсутствию или бесполезному ответу.

Не доверяйте внешнему вводу. Это корень проблемы.

В вашем конкретном случае вы последовательно увеличиваете количество запросов. Это создаст больше запросов, открытых сокетов и другого использования. Чтобы найти решение вашей конкретной проблемы, вам необходим расширенный доступ к серверу, чтобы вы могли просматривать файлы журналов и отслеживать открытые соединения и другие проблемы. Желательно, чтобы вы проверили это на тестовом сервере без какого-либо другого программного обеспечения, создающего соединения, чтобы вы могли изолировать проблему.

Но насколько хорошо вы это сделали, у вас есть только неопределенности. Например, вы можете быть заблокированы внешними серверами, потому что вы делаете слишком много запросов. Вы можете застрять в некоторых фильтрах безопасности, таких как фильтры DDOS и т. Д. Мониторинг и настройка количества запросов (автоматических или ручных) создаст для вас наиболее стабильное решение. Вы также можете просто принять эти потерянные запросы и обработать стабильную очередь, которая гарантирует, что вы получите содержимое в определенный момент времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...