我正在使用echo
将各种文件输出到浏览器,包括一些10MB + .swf文件。我遇到的负面影响是,它似乎在内容中弄乱了一些flash预加载器,导致图像闪烁,而不是显示稳定的进度条。我想知道是否有任何缓冲或其他任何我可以做的事情来解决它。
对于某些背景信息,我必须间接提供内容的原因是它仅设计为授权用户,因此脚本首先检查用户是否具有适当的权限,然后配对readfile()
与echo
。也许有一种更好的方式完全做到这一点,我对创意持开放态度。
修改:
当然, readfile()
和echo
是解释它的简化方式。它的运行方式如下:
<?php
check_valid_user();
ob_start();
// set appropriate headers for content-type etc
set_headers($file);
readfile($file);
$contents = ob_get_contents();
ob_end_clean();
if (some_conditions()) {
// does some extra work on html files (adds analytics tracker)
}
echo $contents;
exit;
?>
答案 0 :(得分:1)
我认为在这种情况下缓冲是多余的。你可以这样做:
<?php
check_valid_user();
// set appropriate headers for content-type etc
set_headers($file);
if (some_conditions())
{
$contents = file_get_contents($file);
// does some extra work on html files (adds analytics tracker)
// Send contents. HTML is often quite compressible, so it is worthwhile
// to turn on compression (see also ob_start('ob_gzhandler'))
ini_set('zlib.output_compression', 1);
die($contents);
}
// Here we're working with SWF files.
// It may be worthwhile to turn off compression (SWF are already compressed,
// and so are PDFs, JPEGs and so on.
ini_set('zlib.output_compression', 0);
// Some client buffering schemes need Content-Length (never understood why)
Header('Content-Length: ' . filesize($file));
// Readfile short-circuits input and output, so doesn't use much memory.
readfile($file);
// otherwise:
/*
// Turn off buffering, not really needed here
while(ob_get_level())
ob_end_clean();
// We do the chunking, so flush always
ob_implicit_flush(1);
$fp = fopen($file, 'r');
while(!feof($fp))
print fread($fp, 4096); // Experiment with this buffer's size...
fclose($fp);
?>
答案 1 :(得分:0)
你可以使用fopen / fread等串联w / echo&amp; flush。如果您还没有预先设置内容类型,则可能需要调用header。此外,如果您使用输出缓冲,则需要拨打ob_flush。
通过这种方式,您可以读取较小的数据并立即回显它们,而不需要在输出之前缓冲整个文件。
答案 2 :(得分:0)
您可能想尝试设置Content-Length标头。
像
这样的东西header('Content-Length: ' . filesize($file));