Я пытаюсь создать веб-приложение для мониторинга сайта, используя PHP. В тот момент, когда я использую curl для сбора заголовков с разных веб-сайтов и обновления базы данных MySQL при изменении статуса веб-сайта (например, если сайт, который был «вверх», уходит «вниз»).
Я использую curl_multi (через Rolling Curl X класс, который я немного адаптировал) для параллельной обработки 20 сайтов (что, похоже, дает самые быстрые результаты) и CURLOPT_NOBODY, чтобы убедиться, что собираются только заголовки, и я попытался упростить сценарий, чтобы сделать его максимально быстрым.
Это работает нормально, и я могу обработать 40 сайтов в ок. 2-4 секунды. Мой план состоял в том, чтобы запускать скрипт через cron каждую минуту … так что, похоже, я смогу обрабатывать около 600 сайтов в минуту. Хотя в данный момент это нормально, в долгосрочной перспективе этого будет недостаточно.
Так как я могу масштабировать это? Можно ли запустить несколько крон параллельно или это приведет к проблемам с горлышком?
Я думал о том, что могу разбить базу данных на группы по 400 и запустить отдельный сценарий для этих групп (например, идентификаторы 1-400, 401-800, 801-1200 и т. Д. Могут запускать отдельные сценарии), поэтому не будет никакой опасности повреждения базы данных. Таким образом, каждый сценарий будет завершен в течение минуты.
Однако может показаться, что это может не сработать, поскольку один скрипт, выполняющий curl_multi, похоже, максимально увеличивает производительность при 20 параллельных запросах. Так будет ли это работать или есть лучший подход?
да, простое решение состоит в том, чтобы использовать тот же PHP-скрипт CLI и передать аргументы 1 и 2, т. е. указать минимальный и максимальный диапазон для обработки записи БД, содержащей информацию о каждом сайте.
Ex. crontab список
* * * * * php /user/script.php 1 400
* * * * * php /user/script.php 401 800
Или используя один скрипт, вы можете запустить многопоточность (многопоточность в PHP с pthreads). Но интервал cron должен основываться на эталоне завершения 800 сайтов.
Ref: Как можно использовать многопоточность в приложениях PHP
Ex. многопоточный скрипт завершается за 3 минуты
затем укажите интервал как * / 3.
Других решений пока нет …