真的没有办法在Windows中使用PHP CLI捕获“杀死信号”吗?

时间:2019-05-25 20:26:11

标签: php windows

任务:当我的PHP CLI脚本被“杀死” /关闭时,我需要能够执行一些代码(通常由我关闭其窗口,或者从PC关闭或重新启动)。理想情况下,我还希望能够指示OS等待其执行某些重要工作的最后一部分,但是我基本上已经放弃了这个“梦想” ...

问题:在PHP中处理此类信号显然是通过“ PCNTL”扩展名完成的,根本不适用于Windows !尽管PHP被称为“跨平台”。

尽管我所做的全部工作是使其与操作系统完全无关(不,这并不意味着“可以在任何Linux发行版上运行”,而是所有当前/受支持的操作系统,或者至少是Windows和Mac),在这种情况下,我将接受Windows特定的解决方案。不高兴,但仍然...

1 个答案:

答案 0 :(得分:0)

这不是解决您问题的确切方法,但也许可以解决。 如果您只想关闭一些手柄,连接等。

register_shutdown_function

此解决方案非常有限

  1. 不能保证回调中给您的脚本多少时间
  2. 您真的不应在回调中使用对其他函数的任何调用- 我注意到了不可预测的行为。有时没有问题,有时没有执行调用,或者只是执行了一些调用-很久以前并使用PHP5.6-不知道PHP v7.x的行为如何。
  3. 由于要点1.使您的代码尽可能简单和简短。完美地只有10-20条程序线。不创建对象,不调用其他函数,也请避免使用静态类。
  4. 由您检查脚本关闭的天气情况是因为脚本关闭只是终止了,还是终止了问题。 传递给shutdown_function的回调将始终在脚本末尾被调用。 一个快速而肮脏的技巧是在脚本的末尾放置一个设置为true的全局变量。 如果调用了通过shutdown函数注册的回调,它将检查该变量是否设置为true。 如果是,则认为脚本已正常关闭;否则,则发生错误或脚本已终止。

好的一面是,该解决方案一旦工作就应该完全独立于目标操作系统。

您问题的第二个解决方案是在Windows和Linux上使用Docker,并将您的应用程序构建为docker容器,该容器从具有扩展名PCNTL的linux发行版启动,或者使用任何PHP docker映像启动FROM并安装通过创建特定的Dockerfile自行扩展。 无论应用程序是在Windows还是Linux上运行,采用这种方法都可以使用PCNTL扩展。

docker中的PHP应用程序可以使用安装在主机系统上的php从命令行运行,几乎具有与独立php应用程序相同的便利。因此,Docker方法似乎更好。