【问题标题】:Detecting teardown of built-in PHP server检测内置 PHP 服务器的拆解
【发布时间】:2017-03-20 20:08:39
【问题描述】:

有没有办法检测正在运行的内置 PHP 服务器是否已停止?通过点击Ctrl-C 或关闭终端窗口。

我将它用于开发环境,并希望在拆卸时清理一些文件。

【问题讨论】:

  • 您的清理代码是否也会在尚未关闭的服务器上运行?还是您打算使用单独的执行环境来执行此操作?
  • 我将在启动时进行预防性清理,并在关机时再次进行清理。此外,在启动时,我正在初始化一个文件观察程序以检测 tmp 文件夹中所有文件的更改。使用 hassan 的解决方案,我可以让文件观察程序检测到关闭,执行清理并自行关闭。所以这是一个完美的解决方案。

标签: php terminal


【解决方案1】:

嗯,我不知道php内置服务器功能中是否存在这样做,

但作为一种解决方法,您可以使用终端来完成此操作,

使用; 符号,用于分隔两个命令,并在第一个命令执行完毕后执行第二个命令。

例如,只有当您点击CTRL+C -完成第一个命令-:

,此脚本才会将关闭行添加到文件 status.txt
php -S localhost:8000 ; echo "shut down" >> status.txt

您可以创建一个新的 php/bash 脚本或其他任何东西来执行特定任务并在退出服务器后执行它 - 在点击 CTRL+C 之后

【讨论】:

  • 谢谢!简单高效。正是我想要的。
  • 还有一件事是行不通的。在Ctrl+C 上生成文件。但是当终端窗口关闭时,当然不会调用第二个命令。有什么方法可以参与该行动?
  • 它会更复杂,当我回到家时,我会尝试用这个更新我的答案;
【解决方案2】:

您可以注册将在脚本退出时由register_shutdown_function()调用的函数

register_shutdown_function(function() {/* Some cleanup activity */});

更复杂的解决方案是通过pcntl_signal() 获取信号。 ctrl + c 的那个是SIGINT

pcntl_signal(SIGINT, "signalHandler");

function signalHandler($signal) {
    switch($signal) {
        case SIGINT:
            print "Caught SIGINT\n";
            exit;
    }
}

【讨论】:

  • shutdown 将在 php 进程结束时执行,而不是在服务器关闭或终止时执行;
  • 是的,但是您可以使用自定义启动脚本包装 php 内置服务器,并在此脚本中处理执行和来自系统的不同信号。就像在 Symfony 框架中一样,您通过输入 app/console server:run 来启动服务器,这是我认为最干净的解决方案。
  • 使用register_shutdown_function 将在您每次刷新页面时执行该功能,因此这不是正确的方法,请检查pcntl_signal 人以检查这是否是探测方式太;
  • 对,我的意思是用它作为执行服务器的包装器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多