使用 MVC 框架和控制器在析构函数中呈现页面。我正在通过 php 下载文件,因此在操作结束时脚本应该结束。
如何在不调用析构函数的情况下结束脚本?
有更好的解决方案吗?
exit 和 die 调用析构函数。
使用 MVC 框架和控制器在析构函数中呈现页面。我正在通过 php 下载文件,因此在操作结束时脚本应该结束。
如何在不调用析构函数的情况下结束脚本?
有更好的解决方案吗?
exit 和 die 调用析构函数。
看到这个答案。尝试在下载文件的类中创建一个析构函数,以检查文件是否确实已发送到浏览器,如果是,则在该析构函数中调用 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");