1

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

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

有更好的解决方案吗?

exit 和 die 调用析构函数。

4

3 回答 3

3

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

于 2012-07-02T22:55:17.470 回答
2

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

于 2012-07-02T23:15:29.657 回答
0

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

$pid = getmypid();
exec("kill $pid");
exec("TSKILL $pid");
于 2015-09-28T07:37:42.243 回答