从ob_clean改为ob_end_clean?

时间:2014-01-21 15:26:04

标签: php

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?

1 个答案:

答案 0 :(得分:6)

ob_clean()刷新缓冲区,但保持输出缓冲有效。这意味着您的readfile()输出也将被缓冲。

ob_end_clean()刷新缓冲区,完全TURNS OFF缓冲,允许readfile()直接转储到浏览器。