0

私は Web オーディオ プレーヤーを作成していますが、キャッシングの信頼性が低いという問題があり、頭に浮かぶのは私が提供しているヘッダーだけです。

一般的な複雑さとセキュリティのため、PHP を介してファイルを解析する必要があります。これは、その場でファイルを作成できることを意味するため問題ありませんが、発生した問題は、ブラウザーが音声トラックをキャッシュしないように見えることです。まれに、トラックの最初の 1/4 のみをキャッシュする場合もあります。それが何をキャッシュしているのか、またはその理由を確実に理解することはできません。

ファイルを提供するコードは次のとおりです。参考までに、「EncodeTrack」機能は、トラックがまだ作成されていない場合にのみエンコードし、ファイルが既に存在する場合は何もしません。

    ## Track Decoder and Streamer
if($_GET['playtrack']) {
    error_log("Dec Start");
    $dectimer = microtime(1);
    ini_set('display_errors', 0);
    $track = trim($_GET['playtrack']);
    preg_match('%^(\w+)\-(\w+)\.(\w+)$%', $track, $trackbits);
    $trackid = $trackbits[1];
    $trackquality = $trackbits[2];
    $trackformat = $trackbits[3];

    $trackarr = mysql_fetch_array(mysql_query("SELECT * FROM `tracks` NATURAL JOIN `artists` NATURAL JOIN `albums` WHERE `track_hash` = '$trackid' LIMIT 1"));
    $file = "$musicfolder/$trackarr[artist_folder]/$trackarr[album_folder]/$trackarr[track_path]";
    $trackpath = escapeshellarg($file);

    EncodeTrack($trackid, $trackformat, $trackpath, $trackquality);
    $transfile = "tmp/$trackid-$trackquality.$trackformat";

    if(file_exists($transfile)) {
        $filesize = filesize($transfile);
        $file = fopen($transfile, 'r');

        if($_SERVER['HTTP_RANGE']) {
            $partial = 1;

            $range = str_replace('bytes=', '', $_SERVER['HTTP_RANGE']);
            $range = explode(',', $range);
            $range = explode('-', $range[0]);

            if($range[0] === '') {
                $end = $filesize - 1;
                $start = $end - intval($range[0]);
            }elseif($range[1] === '') {
                $start = intval($range[0]);
                $end = $filesize - 1;
            }else{
                $start = intval($range[0]);
                $end = intval($range[1]);
                if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file
            }      
            $length = $end - $start;

            header("HTTP/1.1 206 Partial Content", 1, 206);
            header("Content-Range: bytes $start-$end/$filesize");
            fseek($file, $start);
        }else{
            $length = $filesize;
        }

        $data = fread($file, $filesize);
        fclose($file);

        header("Content-Length: $length");
        header("Content-Type: audio/$trackformat");
        header("Accept-Ranges: bytes");
        header("Expires: Tue, 23 May 2062 10:00:00 GMT");
        header("ETag: $length");
        header("Cache-Control: public");

        echo($data);
    }else{
        header("HTTP/1.1 404 Not Found", 1, 404);
    }

    error_log("Dec Complete - ".round((microtime(1) - $dectimer)*100));
    exit;
}

ここで何が欠けているのか、私はアイデアがありません。部分的なコンテンツの処理に関しては、私が間違っていることもあるかもしれませんが、私が知る限り、それは正気です.

4

1 に答える 1

1

部分的なコンテンツの処理に問題があると思われる場合はpecl_http、正しいヘッダーとバイトを送信してください。

if(file_exists($transfile))ブロックを次のようにhttp_send_file()に置き換えます。

http_send_file($transfile);

あなたのコードはより軽く、バグが少ないことを知っています...さらに、pecl_httpを使用すると、次のような無料のボーナス機能を利用できます。http_throttle()

お役に立てれば !

于 2012-05-23T15:26:48.140 に答える