@sarathorn
php программист, веб-дизайнер, коллекционер

Как сделать красивый планировщик для PHP скрипта?

Доброго локалтайма!

Друзья, есть такая ситуация:
1) некий API с ограничением на 3 запроса в сукунду
2) большая очередь запросов к API

Отсюда получается, что скрипт может без лишних проблем выполнить и более трёх запросов за секунду...
На сервере стоит CentOS, сервис написан на PHP без фреймворков.

Гуглил в сторону CRON... Там можно вызывать скрипт максимум раз в минуту... Так у меня очередь задач быстро выстроится на месяца. Как вариант, можно сделать так:
<?
$i=0; $max=45;
while ($i<$max){
  //Начало запроса к АПИ

  //Конец запроса к АПИ
$i++;
sleep(1);
}
?>


И дёргать этот скрипт каждую минуту кроном. Скрипт выполнит 45 запросов за минуту, таким образом останется время на всякий случай и будет даже запас по кол-ву запросов в секунду. Метод масштабируется, можно в цикл засунуть два запроса к апи и общее количество выполнений будет уже 90 за минуту.

Скрипту придётся делать запросы к БД. Общую схему вижу так:
1) запрос всех строк из БД, лимит 45
2) запуск цикла
3) запрос к АПИ
4) запрос к БД с обновлением информации ("задание №х выполнено" или "задание №х завершено с ошибкой такой-то")
5) $i++
6) конец цикла, все счастливы

В перспективе планируется интеграция и других АПИ в сервис, то есть совсем скоро таких скриптов-работников будет 4-5.

Вопросов несколько:
1) насколько такое решение выглядит красиво?
2) есть ли решения лучше?
3) будут моменты, когда очередь задач будет пустая, но cron всё равно будет дёргать скрипты, это страшно? (4 скрипта, 4 запроса к БД в минуту...)
4) сильно ли данное решение будет нагружать сервер? (например, 5$ дроплет на DigitalOcean?)

Заранее всем большое спасибо за ответы!
  • Вопрос задан
  • 1858 просмотров
Решения вопроса 1
He11ion
@He11ion
PHP-monkey
Грамотно заданный вопрос - уже пол-ответа. Крон не рассчитан на подобную работу, Вы правы, он для запуска скрипта раз в н-времени. Для Вашей задачи стоит использовать Gearman/Beanstalk/что-то еще по вкусу, там легко будет и балансировать нагрузку и разруливать кол-во воркеров.
По нагрузке - сильно зависит от того, какие вычисления/объемы данных, сразу не сказать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sam002
@sam002
Линуксойд, кодер, немного физик.
Стойте! Вот что-нибудь пойдёт не так(будет дольше секунды три запроса обрабытываться или поток php будет ждать выполнения долго) и получите блокировку очереди. Ограничивать по времени надо с отбрвсыванием просроченных заданий. Рекомендую скрестить php.net/manual/ru/class.splqueue.php с ассинхронным демоном (из свежего, но непроверенного: https://github.com/walkor/workerman-queue).
Если хотите проще, то переводите ограничения на "запросов в минуту" и тогда можно из крона обрабатывать, тк будет возможность прибивать стухшие обработчики очереди из скрипта запуска.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы