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

时间:2012-07-02 22:52:16

标签: php response destructor

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

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

有更好的解决方案吗?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

正如David所说:你需要在析构函数中调用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来完成的。在我们的例子中,我们只是通过返回一个空字符串来丢弃它。

答案 2 :(得分:0)

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

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