1

echo10MB以上の.swfファイルなど、さまざまなファイルをブラウザに出力するために使用しています。私が経験しているマイナスの副作用は、コンテンツ内の一部のフラッシュ プリローダーが台無しになっているように見えることです。たとえば、安定した進行状況バーを表示する代わりに、画像がちらつきます。何らかのバッファリングが行われているのか、またはそれを修正するために他に何かできることがあるのだろうか.

いくつかの背景情報については、コンテンツを間接的にフィードする必要がある理由は、許可されたユーザーにのみ提供されるように設計されているためです。そのため、スクリプトは最初にユーザーが適切な権限を持っていることを確認し、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;
?>
4

3 に答える 3

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);
?>
于 2012-07-10T17:38:19.543 に答える
0

Content-Lengthヘッダーを設定してみてください。

何かのようなもの

header('Content-Length: ' . filesize($file));
于 2012-07-10T17:24:32.413 に答える
0

おそらく、 fopen / freadなどを echo およびflushと連携して使用できます。まだコンテンツタイプを設定していない場合は、ヘッダーを呼び出して事前にコンテンツタイプを設定する必要があります。また、出力バッファリングを使用している場合は、ob_flushを呼び出す必要があります。

このようにして、出力前にファイル全体をバッファリングする必要がなく、小さなデータを読み取ってすぐにエコーすることができます。

于 2012-07-10T17:23:04.783 に答える