【问题标题】:How to stop PHP code execution?如何停止 PHP 代码执行?
【发布时间】:2014-02-22 19:54:11
【问题描述】:

有没有办法立即停止 PHP 代码执行?

我知道exit,但它明确指出:

终止脚本的执行。即使调用了 exit ,也将始终执行关闭函数和对象析构函数。

所以我想要实现的是在我调用 exit 或其他什么时完全停止 PHP 代码执行。

有什么帮助吗?

编辑:在简森的回答之后

试验一:

function newExit() {
    __halt_compiler();
}    
echo "start";
newExit();    
echo "you should not see this";

显示Fatal error: __HALT_COMPILER() can only be used from the outermost scope in,这是意料之中的。

试验 2:

function newExit() {
    include 'e.php';
}
echo "start";
newExit();
echo "you should not see this";

e.php 只包含__halt_compiler();

这表明开始你不应该看到这个

编辑:我为什么要这样做?

我正在开发一个应用程序,该应用程序包含一个作为加密代码提供的专有库(通过我无权访问的虚拟主机配置文件需要)。是一种出于安全目的的监控库。它的行为之一是它注册了一些记录实例状态的关闭函数(它将统计信息保存到数据库中)

我想要做的是禁用此日志记录基于(远程IP)的某些特定条件

【问题讨论】:

  • 死();可能有帮助
  • @ArthurYakovlev 退出和死亡之间的行为几乎没有区别
  • >这个语言结构等价于exit()。
  • 请问您为什么要这样做?通常写类或关闭函数的人写它们是有原因的。
  • 这是一种极端且不寻常的行为。 @skafandri 没有提供需要执行此操作的极端和不寻常的用例。有什么需要?在您的示例中,exit() 可以正常工作。

标签: php


【解决方案1】:

请查看用户Pekka 웃的以下信息

根据手册,即使使用die()exit() 终止脚本,也会执行析构函数:

即使使用exit() 停止脚本执行,也会调用析构函数。在析构函数中调用 exit() 将阻止执行剩余的关闭例程。
根据PHP: destructor vs register_shutdown_function,当达到 PHP 的执行时间限制时,析构函数被执行(在 Apache 2 上确认,在 Windows 7 上确认 PHP 5.2)。

由于达到内存限制,当脚本终止时,析构函数也会被执行。 (刚刚测试)

析构函数确实在致命错误时执行(刚刚测试)更新:OP 无法确认这一点 - 似乎存在致命错误,但情况有所不同

它确实不会在解析错误时被执行(因为整个脚本不会被解释)

如果服务器进程崩溃或发生其他 PHP 无法控制的异常,析构函数肯定不会被执行。

在此问题中引用 Are there any instances when the destructor in PHP is NOT called?

【讨论】:

    【解决方案2】:

    你可以尝试杀死 PHP 进程:

    exec('kill -9 ' . getmypid());
    

    【讨论】:

    • 高度依赖执行方法(cgi、fcgi、webserver 模块...)和权限。
    • 这似乎是避免请求被登录access_log的最好方法。
    【解决方案3】:

    你可以使用__halt_compiler函数来停止编译器的执行

    http://www.php.net/manual/en/function.halt-compiler.php

    【讨论】:

    • 编译器不会执行'__halt_compiler'之后的代码,但它真的不会调用析构函数和关闭函数吗?我实际上并没有检查,但我想它会调用它们(想不出任何不这样做的原因)。
    • 编译器在该语句之后是否仍然看到类/函数定义? PHP 中的编译时间和运行时间之间存在差异,这可能是这里的问题。
    • 还要注意以下内容,错误,来自文档的注释:__halt_compiler() can only be used from the outermost scope.
    • @ToBe 根据这里的评论:stackoverflow.com/questions/5270486/… Because PHP would already be running by the time exit is called; __halt_compiler tells PHP to ignore everything after it as if it were inside one big /* comment */ 好像什么都没看到
    【解决方案4】:

    除了显而易见的die()exit(),这也可以:

    <?php
    echo "start";
    __halt_compiler();
    echo "you should not see this";
    ?>
    

    【讨论】:

      【解决方案5】:

      return 有什么问题?

      echo "you will see this";
      return;    
      echo "you will not see this";
      

      【讨论】:

        【解决方案6】:

        我不确定你是否理解“退出”状态

        Terminates execution of the script. Shutdown functions and object destructors will always be executed even if exit is called.
        

        这样做很正常,它必须清除你之前调用的所有变量和函数的内存。不这样做将意味着您的内存将一直卡在 RAM 中并被占用,如果这种情况多次发生,您将需要重新启动并刷新 RAM 才能留下任何内存。

        【讨论】:

          【解决方案7】:

          或者试试

          trigger_error('Die', E_ERROR);
          

          【讨论】:

          • 应该等同于 exit() 或 die() 但也取决于使用的错误处理程序。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多