Улучшение производительности cURL (PHP Library) - PullRequest
1 голос
/ 27 февраля 2009

Вот краткий обзор того, что я делаю, это действительно очень просто:

  • Выйти и извлечь записи из таблицы базы данных.
  • Просмотрите все эти записи, и для каждого столбца, содержащего URL, выйдите (используя cURL) и убедитесь, что URL все еще действителен.
  • Для каждой записи столбец обновляется с отметкой о текущем времени, указывающей, когда она была в последний раз проверена, и выполняется некоторая другая обработка дБ.

Во всяком случае, все это работает хорошо, и делает именно то, что и должно. Проблема в том, что я думаю, что производительность может быть значительно улучшена с точки зрения того, как я проверяю URL с помощью cURL.

Вот краткая (упрощенная) выдержка из моего кода, которая демонстрирует, как используется cURL:

$ch = curl_init();
while($dbo = pg_fetch_object($dbres))
{
   // for each iteration set url to db record url
   curl_setopt($ch, CURLOPT_URL, $dbo->url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_exec($ch); // perform a cURL session
   $ihttp_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
   // do checks on $ihttp_code and update db
}
// do other stuff here
curl_close($ch);

Как вы можете видеть, я просто все время повторяю один и тот же дескриптор cURL, но даже если я теряю всю обработку (базу данных или иным образом), выполнение сценария все равно занимает невероятно много времени. Поможет ли изменение какого-либо из параметров cURL улучшить производительность? Настройка значений тайм-аута / и т. Д.? Любой вклад будет оценен.

Спасибо,

  • Николай

1 Ответ

9 голосов
/ 27 февраля 2009

Установите CURLOPT_NOBODY в 1 (см. документация по curl ), чтобы программа curl не запрашивала текст ответа. Это свяжется с веб-сервером и выдаст запрос HEAD. Код ответа скажет вам, если URL действителен или нет, и не будет передавать большую часть данных обратно.

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

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