Как постоянно обрабатывать события на php?

Знаю, что за язык php и знаю как и в какой момент он обрабатывается и что в принципе он не предназначен для таких задач. Но есть api одного сервиса, которое реализует функционал различных событий, которые могут происходить в любой момент времени и не зависят от того, что происходит в моем коде в данный момент.

Не буду выкладывать всю реализацию, но суть проста:

while(true) {
   // Проверка наступления события
}


То есть требуется, постоянно проверять не наступает ли какое то событие и выполнять нужный код в случае наступления. Получается что скрипт должен постоянно висеть в памяти.

Мне кажется, что это не правильно. Не правильно использовать php для этой задачи, но другой реализации связи с этим сервисом нет. Так вот вопрос как лучше реализовать данную задачу, как постоянно проверять наличие событий? Отключить таймаут времени выполнения скрипта в php.ini не представляется возможным поскольку в другом коде этого же проекта таймаут крайне важен. Может быть есть какие либо модули для php, которые помогут более менее грамотно реализовать подобное.
  • Вопрос задан
  • 3924 просмотра
Решения вопроса 1
@dredd_krd
У PHP есть функция, выполняемая в коде: set_time_limit ( int $seconds );. При передаче 0 в параметре конкретно этот скрипт будет жить вечно, пока не появится фатальная ошибка/не крашнется, и т.п..
Конечно, реализовывать через PHP таких демонов не комильфо, но в качестве исключения ничего плохого в этом не вижу. PHP так же может реагировать на сигналы, умеет управлять своим процессом почти как настоящий демон, поэтому реализовать вполне реально.

Второй вариант - запускать скрипт постоянно по крону (или по планировщику в виндах), но при единственной проверке в коде, проверки эти будут проходить каждую минуту, что может не подойти (зависит от задачи).
Я бы написал демона с бесконечным временем выполнения и первое время мониторил бы его работу каким-нибудь другим скриптом, чтоб убедиться, что оно летает и не падает.
Памяти/процессора он жрёт не много, фактически работать всё будет. А то, что PHP для этого не используется - это просто издержки программерских религий :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
EagleMoor
@EagleMoor
PHP Yii2 RESTful API Developer
Используйте supervisord.org для поднятия скрипта как демона и в

while (true) {...}

делайте что вам угодно. Supervisord следит за состоянием процесса и если тот умирает, то перезапускает его. Если боитесь переполнения памяти, то можете вырубать сам скрипт через определенное время или если он съел много памяти через exit или die;

Кстати, очень странное апи, если оно реализует события, которые могут возникнуть асинхронно, то ищите описание сокет протокола для этого апи, обычно более грамотно реализовывать серверные события по сокету (или веб сокету), тк они асинхронны.
Ответ написан
@hurgadan
1) можно реализовать демона на PHP. Например: habrahabr.ru/post/134620. И на Хабре много об этом написано, это просто первая ссылка из Google.
2) Отключить таймаут можно для конкретного скрипта, необяательно делать это глобально в php.ini. Для этого существует функция set_time_limit()
3) Можно использовать планировщик какой-нибудь, например cron, если вы работает в *nix.
4) Видел еще такую реализацию, если речь идет о сайте: на хите срабатывает обработчик, который проверяет если ли какие-либо события, которые необходимо обработать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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