Неужели в PHP CLI нет способа захватить «сигнал уничтожения» в Windows? - PullRequest
0 голосов
/ 25 мая 2019

Миссия: мне нужно иметь возможность выполнять немного кода, когда мои PHP CLI-скрипты «убиты» / закрыты (обычно я закрываю их окна или выключаю или перезагружаю ПК). В идеале я хотел бы также иметь возможность дать указание ОС ждать, пока она выполняет последние биты какой-то важной работы, но я, по сути, разочаровался в этой «мечте» ...

Проблема: обработка таких сигналов в PHP, по-видимому, выполняется с помощью расширения "PCNTL", которое вообще не доступно для Windows ! Это несмотря на то, что PHP называется «кроссплатформенным».

Хотя весь смысл того, что я делаю, заключается в том, чтобы он был полностью независимым от ОС (нет, это не означает «работает на любом дистрибутиве Linux», но все текущие / поддерживаемые ОС или, по крайней мере, Windows и Mac), я бы в этом случае принял решение, специфичное для Windows. Не радостно, но все же ...

1 Ответ

0 голосов
/ 25 мая 2019

Это не точное решение вашей проблемы, но, возможно, может быть решением проблемы.Если вы просто хотите закрыть некоторые ручки, соединения и т. Д.

register_shutdown_function

Это решение очень ограничено

  1. гарантии нетсколько времени отводится вашему скрипту внутри обратного вызова
  2. вы действительно не должны использовать какие-либо вызовы других функций внутри обратного вызова - я заметил непредсказуемое поведение.Иногда проблем не возникало, а иногда не выполнялись вызовы, или только некоторые из них - это было давно и с использованием PHP5.6 - не знают, как работает PHP v7.x
  3. из-запункт 1. сделайте ваш код максимально простым и коротким.Отлично всего 10-20 процедурных строчек.Не создавать объекты, не вызывать другие функции, избегайте также статических классов.
  4. Вы должны проверить, завершился ли сценарий завершением, потому что он просто завершился или возникла проблема с его завершением.обратный вызов, переданный функции shutdown_function, всегда будет вызываться в конце скрипта.быстрый и грязный трюк состоит в том, чтобы поместить в конец вашего скрипта глобальную переменную, которая имеет значение true.если вызывается обратный вызов, зарегистрированный функцией shutdown, он проверяет, установлено ли для этой переменной значение true.и если это так, он считает, что скрипт нормально закрывается, а если нет, то возникает ошибка или скрипт прекращается.

хорошая сторона в том, что это решение после работы должно быть полностью независимым от целевой ОС.

Вторым решением вашей проблемы является использование Docker в Windows и Linux и сборка приложения в качестве docker-контейнера, запускающего дистрибутив FROM linux с расширением PCNTL, или использование любого образа docker PHP для запуска FROM и установите расширение самостоятельно, создав определенный Dockerfile.При таком подходе, независимо от того, запущено ли приложение в Windows или Linux, у вас есть доступное расширение PCNTL.

Приложения PHP в докере можно запускать из командной строки почти с тем же удобством, что и автономное приложение php с использованием установленного phpна хост-системе.Таким образом, подход к Докеру выглядит намного лучше.

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