readfile的PHP文档有一个如何下载文件的例子:
<?php
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
使用ob_clean删除可能在输出缓冲区中的内容。
但是我已经阅读了帖子(http://heap.tumblr.com/post/119127049/a-note-about-phps-output-buffer-and-readfile),表明对于大文件应该使用ob_end_clean而不是ob_clean。
我的问题是:使用ob_clean而不是ob_end_clean有什么用?如果ob_end_clean像ob_clean一样工作并避免出现问题,为什么不是所有文档都显示使用ob_end_clean?
答案 0 :(得分:6)
ob_clean()
刷新缓冲区,但保持输出缓冲有效。这意味着您的readfile()
输出也将被缓冲。
ob_end_clean()
刷新缓冲区,完全TURNS OFF缓冲,允许readfile()
直接转储到浏览器。