Повышение производительности cURL (библиотека PHP)

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

  • Выйдите и возьмите записи из таблицы базы данных.
  • Просмотрите все эти записи и для каждого столбца, содержащего 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)

Решение

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

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