Обработка сигналов в Windows - PullRequest
9 голосов
/ 26 июля 2010

У меня есть автономный сценарий PHP, и я обработал бы сигнал, отправленный из ОС Windows, чтобы выполнить постепенное завершение работы при выдаче «сигнала уничтожения».

Как это сделать в Windows?*

Ответы [ 2 ]

8 голосов
/ 26 мая 2016

Хотя единственный другой ответ здесь является кратким и точным, ему не хватает подробностей о том, почему в Windows отсутствует поддержка сигналов.

Во-первых, сигналы - это довольно ограниченный и устаревший способ связи с процессом.,Есть много более богатых способов сообщить процессу, что он должен отбросить то, что он делает, и сделать что-то еще.Даже на платформах POSIX, обработчики сигналов должны быть ОЧЕНЬ легкими - код в обработчиках сигналов должен быть готов / способен обрабатывать несколько сигналов, поступающих одновременно.

PHP разрешает обработчики сигналов через pcntl_signal() со значительным количеством предостережений.Прежде чем их можно будет использовать, код должен отрегулировать количество проходов, перед тем как PHP передаст сигнал, поступивший в обработчик.Тик - это количество инструкций, которые Zend (ядро PHP) выполнит перед проверкой состояния обработчика сигналов и выполнением необходимых обратных вызовов.Это в основном занятый цикл в основном цикле выполнения.Таким образом, корректировка тиков значительно замедлит процесс, если следовать рекомендации за тик 1.Комментарии к функции предполагают, что значение тика 100 достаточно для большинства систем.Самый простой способ понять, как работает обработчик, - это то, что за кулисами существует фактический обработчик сигнала, который собирает информацию о сигнале, которую PHP иногда запрашивает, чтобы узнать, был ли вызван обработчик, какой сигнал был отправлен и т. Д., Если так, тоинформация передается обратному вызову в пользовательском пространстве (т. е. ваш код).Это не реальная обработка сигналов, и она никогда не будет вызвана опасностями и трудностями, которые представляет реальная обработка сигналов.

Вторая проблема заключается в том, что даже с поддержкой обработчика псевдосигналов, которую обеспечивает pcntl_signal (), PHP может потерятьинформация о сигналах, которые произошли.Если происходит сценарий с несколькими сигналами, сценарий не будет уведомлен о том, что какой-то сигнал произошел несколько раз.Чем больше значение тика, тем больше вероятность того, что это может произойти, особенно в загруженной системе.

В большинстве случаев Windows не использует сигналы.Существует функция SetConsoleCtrlHandler () , которая существует для захвата Ctrl + C и Ctrl + Break и приблизительно эквивалентна SIGINT.Недостатком является то, что к процессу должна быть подключена консоль, чтобы она могла работать и не могла быть отправлена ​​другими процессами.Функция TerminateProcess () эквивалентна SIGKILL, которую нельзя блокировать / обрабатывать в других ОС, и сигнал SIGKILL фактически не поступает в целевой процесс.Кроме этих двух функций / сигналов, очень мало общего.В конечном счете, Windows - это совсем другой зверь под капотом.

Единственная причина, чтобы взглянуть на сигналы, - это какой-то длительный процесс PHP - задача, которую, кажется, все говорят, что язык не подходитдля (я полностью не согласен, но это другое обсуждение).Когда я узнал об ограничениях поддержки сигналов в PHP даже в операционных системах POSIX, я решил, что на самом деле они не являются ответом на мою ситуацию.Правильное решение - полностью игнорировать сигналы.Для SIGINT сценарии командной строки должны быть написаны для обработки сценария преждевременного завершения, то есть они должны быть идемпотентными.В мире PHP сигналы в значительной степени не имеют значения, поскольку существуют другие, более гибкие и богатые решения, включая именованные мьютексы / события, сокеты, файлы, именованные каналы, разделяемую память, Service Manager и т. Д.

4 голосов
/ 26 июля 2010

PHP не поддерживает обработку сигналов в Windows. К сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...