php回显大块数据

时间:2012-07-10 17:09:45

标签: php apache flash

我正在使用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;
?>

3 个答案:

答案 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));