Задать вопрос

Демон на PHP — как извне менять параметры?

Привет. Не хочу устраивать холивар, необходимо написать демона на php


Задача такая: есть long-polling запрос к серверу с параметрами, например array('param1'=>'q1,q2', 'param2'=>'q3'), при получении ответа вызывается функция, которая разбирает и пишет результат в БД (запрос продолжает работать). Необходимо, чтобы этот запрос работал всегда, когда параметры установлены и ждал их появления, когда их нет. При этом есть необходимость менять параметры извне — через БД, файлы или мемкеш.


Как можно сообщить демону, что параметры изменились и необходимо перезапустить запрос? Пробовал разобраться в phpDaemon, но без толковой документации сделать это не получилось.
  • Вопрос задан
  • 3431 просмотр
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
tyzhnenko
@tyzhnenko
System Administrator, DevOps, QA Engineer
Обрабатывать сигналы HUP и другие
stackoverflow.com/questions/7864349/how-do-i-catch-a-kill-or-hup-or-user-abort-signal
Ответ написан
Комментировать
Как на счёт подхода «проверять время от времени не изменились ли параметры»?
Ответ написан
Комментировать
seriyPS
@seriyPS
Очень как то вы запутанно все описали, я толком не понял. Вконтактовский мессенджер чтоли парсите?
Как конкретно в PHP не скажу, но обычные подходы такие:
Если параметры меняются НЕ часто, то их записывают в конфиг-файл и посылают демону UNIX-сигнал, например sighup:
kill SIGHUP
Демон должен установить обработчик этого сигнала - при получении сигнала перечитывать конфиг.

Если меняются часто, то помимо самого "рабочего" сокета, который ждет этот long-pool запрос, открывают еще один - контрольный сокет (слущающий ru.php.net/manual/en/function.socket-listen.php) на котором ждут появления команд/новых параметров. Он может слушать локальный TCP/UDP порт или UNIX сокет, а то и pipe. Правда тогда появляется проблема, что нужно контролировать сразу 2 сокета - тут уже нужны потоки или select/epool.

Ну и третий вариант - просто периодически опрашивать БД/перечитывать конф-файл, например после окончания long-pool запроса или по sleep() если запросов нет. Но это уже детский сад))
Ответ написан
phpDeamon примеров, по-моему куча, ну или node.js + socket.io.
Ответ написан
Комментировать
@egorinsk
> Как можно сообщить демону, что параметры изменились и необходимо перезапустить запрос?

Самый простой способ — демон слушает соединение и получает по нему команды.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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