@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?)

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

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

Похожие вопросы