如何在不调用析构函数的情况下退出 PHP 脚本


How to exit a PHP script without calling the destructor?

使用 MVC 框架,控制器在析构函数中呈现页面。我正在通过 php 下载一个文件,所以在操作结束时脚本应该结束。

如何在不调用析构函数的情况下结束脚本?

有没有更好的解决方案?

退出并死亡调用析构函数。

看到这个答案。尝试在下载文件的类中创建一个析构函数,该文件检查文件是否确实发送到浏览器,如果是,请在该析构函数中调用 exit()。

正如大卫所说:你需要在析构函数中调用 exit() 来阻止它。

但是,如果您只想停止由这些析构函数引起的可视输出,而不是它们可能执行的任何其他副作用(文件关闭、数据库连接关闭),那么最好只终止进一步的输出,但不要管析构函数。在我看来,这将是要采取的路线,因为析构函数往往有一个重要原因:清理。

您可以通过操作缓冲输出来做到这一点:

<?php
class Tester{
   public function devNull($string){
       return "";
   }
   public function runAndBreak(){
        print "run" . PHP_EOL;
        // if any output buffer is working, flush it and close it
        if(ob_get_level()) ob_end_flush();
        // redirect new buffer to our devNull
        ob_start(array($this,'devNull'));
        exit();
        print "still running";
   }
   function __destruct(){
        print "destructor" . PHP_EOL;
   }
}
$t = new Tester();
$t->runAndBreak();

这只会打印run,而不打印析构函数中的内容。这是通过将您自己的回调例程提供给处理然后返回输出的ob_start来完成的。在我们的例子中,我们只需通过返回一个空字符串来丢弃它。

这肯定会停止你的脚本,但要小心,如果你运行这样一个服务器,其中一个进程为多个PHP请求提供服务,这些请求也会停止:

$pid = getmypid();
exec("kill $pid");
exec("TSKILL $pid");