【问题标题】:How to determine that a PHP script is in termination phase?如何确定 PHP 脚本处于终止阶段?
【发布时间】:2011-06-03 13:20:41
【问题描述】:

PHP 中是否有任何函数/全局变量可以返回脚本的当前状态(例如运行、终止)?

或者是使用register_shutdown_function() 设置此状态的唯一方法?

该函数在我看来不灵活,因为可以用它覆盖已注册的关闭函数。还有shutdown function gets executed when a user aborts the connection,这不是我要明确寻找的,我不想引入太多约束。

除了register_shutdown_function() 有什么替代品吗?或者如果没有,如何处理该功能的缺点?

更新

澄清一下:我不是在寻找连接状态(例如connection_aborted()),而是寻找 PHP 脚本的运行状态(运行、终止)。查找更多关于我已经知道的连接状态的函数,但是脚本的当前状态呢?脚本是否已经被终止并且对象(将要被)销毁?

更新2

为了进一步澄清,我仍然不是在寻找connection state 而是寻找与运行状态类似的东西。它也应该在没有任何连接状态的 CLI 中工作,因为没有与执行代码相关的 TCP 连接 - 以更好地说明我在寻找什么。

【问题讨论】:

  • 有点 fff 主题,但您做的事情非常非常错误(PHP 不像 Java 或 C++)。为什么需要判断脚本是否处于终止阶段?我从来不需要这样做。如果你不介意我问的话。
  • 我完全不介意这个问题。这个问题与"how to trigger user error with trigger_error in an object destructor while the script shuts down?" 相关,这可能给人一种可以使用的印象。我知道它在某种程度上是具体的,但是由于该语言提供了一些基于状态的功能(即异常抛出和 - 看起来像未记录的 - 错误触发),我需要知道这一点。

标签: php interpreter shutdown


【解决方案1】:

在阅读了大部分 PHP 源代码后,我得出的结论是,即使这种状态存在于经验层面,它们在解释器中并不真正以标志或变量的形式存在。

例如,关于抛出异常的代码决定了各种变量是否可能。

因此,问题的答案是否定的。

到目前为止,我能找到的最佳解决方法是为此设置一个全局变量,该变量在已注册的关闭函数中设置。但是 PHP 的标志似乎并不真正可用。

<?php

register_shutdown_function(function() {$GLOBALS['shutdown_flag']=1;});

class Test {
    public function __destruct() {
        isset($GLOBALS['shutdown_flag']) 
            && var_dump($GLOBALS['shutdown_flag'])
            ;
    }
}

$test = new Test;

#EOF; Script ends here.

【讨论】:

【解决方案2】:

您正在寻找:

Connection_aborted();

http://it.php.net/manual/en/function.connection-aborted.php

Connection_status();

http://it.php.net/manual/en/function.connection-status.php

附录

不能有任何已终止状态,因为如果它已终止,您将无法检查其状态 lol

【讨论】:

  • 不,我不是在寻找与连接状态相关的函数,而是在寻找与 run_state 相关的函数、变量或标志(如果有的话)。我认为这从我的问题中已经很清楚了,将检查措辞。
  • @hakre:不可能有任何已终止状态,因为如果已终止,您将无法检查其状态,哈哈!
  • @yes123:对象的析构函数中的代码在脚本代码执行结束时仍在内存中(我在该点终止阶段之后命名所有内容)在该终止阶段执行。也就是说,脚本结束后我仍然可以执行代码。
  • @hakre:你可以用connection_status()检查一下;
  • @yes123: connection_status() 在我的情况下返回 0(使用 CLI 这可能就是原因),因此 connection_status() 根本没有提供我可以使用的数据。 0 为正常状态。
【解决方案3】:

我自己还没有(实际)使用过它,但你也许可以使用:

http://www.php.net/manual/en/function.register-tick-function.php

使用这意味着您可以在脚本运行时编写文件或更新数据库或其他内容...即将记录会话/某些 id 和时间戳 id 写入文件或其他内容并检查执行之间的时间,也许,您可以说如果它在 X 秒内没有更新,它仍在运行。

但如前所述,PHP 是无状态的,因此 PHP 不会意识到这一点。

如果做不到这一点,您可以在脚本开始时/就在脚本“结束”之前以某种方式设置数据库字段,但实际上会产生很多开销。

【讨论】:

    【解决方案4】:

    有没有函数/全局 PHP 中的变量返回 脚本的当前状态(某 比如运行、终止)?

    不,PHP 是无状态的。

    【讨论】:

    • 根据PHP手册,PHP不是无状态的。例如有三个connection states。但我不是在寻找连接状态(CLI 代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2016-03-09
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多