Я соскребаю данные с URL используя cURL
for ($i = 0; $i < 1000000; $i++) {
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://example.com?page='.$i);
curl_exec($curl_handle);
curl_close($curl_handle);
// some code to save the HTML page on HDD
}
Я хотел знать, есть ли способ ускорить процесс? Может многопоточность? Как я мог это сделать?
cURL Multi не делает параллельные запросы, он делает асинхронные запросы.
До 5 минут назад документация была неправильной, для развертывания и перевода исправленной документации потребуется некоторое время.
Асинхронный ввод-вывод (с использованием чего-то вроде cURL Multi API) является самым простым делом, однако он может выполнять запросы только асинхронно; обработка данных после загрузки, например, запись на диск, все равно будет вызывать много блокирующих операций ввода-вывода, аналогично дальнейшая обработка данных (например, синтаксический анализ json) будет происходить синхронно, в одном потоке выполнения.
Многопоточность — другой вариант, для этого требуется, чтобы у вас была многопоточная сборка PHP и установлено расширение pthreads.
Многопоточность имеет то преимущество, что вся обработка может выполняться для каждой загрузки и последующих действий параллельно, полностью используя все доступные ядра ЦП.
Что лучше, зависит в значительной степени от того, сколько обработки загруженных данных должен выполнить ваш код, и даже в этом случае это можно считать вопросом мнения.
Вы ищете curl_multi_*
набор функций: «Позволяет параллельно обрабатывать несколько дескрипторов cURL».
Посмотрите на полный пример на curl_multi_init()
страница.
Проверьте эти статьи для получения дополнительной информации о том, как curl_multi_exec()
работает: