2012-05-23 1 views
0

웹 오디오 플레이어를 쓰고 있는데 캐시가 제대로 작동하지 않는 문제가 있습니다. 내가 제공하는 헤더가 마음에 듭니다.HTML5 오디오가 캐싱되지 않은 PHP를 통해 전달됨

일반적이고 보안상의 문제로 인해 PHP를 통해 파일을 구문 분석해야합니다. 즉석에서 파일을 만들 수 있기 때문에 괜찮습니다.하지만 문제는 브라우저가 오디오를 캐시하지 않는 것입니다. 드문 경우를 제외하고는 더 이상 트랙을 재생할 수 없으며 트랙의 처음 1/4 만 캐시 할 수도 있습니다. 나는 캐싱 (caching) 또는 캐싱 (caching) 이유를 안정적으로 해결할 수 없습니다.

파일을 제공하는 코드는 다음과 같습니다. 참고로, "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; 
} 

나는 여기에서 놓친 아이디어가 없습니다. 부분적인 내용 처리 측면에서 내가 잘못하고있는 것일 수도 있지만, 제정신이라고 말할 수있는 한.

+0

나는 비디오 파일과 비슷한 문제가 있었는데 문제는 코드가 아니라 companys 내부 네트워크가 byterange 요청을 차단하여 (일부 방화벽 설정 때문에) 제대로 처리되지 못하게했다. 어쩌면 당신은 똑같은 고통을 겪고 있습니다. 그렇다고하더라도 스트리밍이 진짜 고통이 될 수 있고 대부분 문제는 코드가 아니라 네트워크 전송이 될 수 있으므로 마음에 두십시오. – acme

답변

1

부분 콘텐츠 처리에 문제가 있다고 생각되면 pecl_http에 올바른 헤더와 바이트를 보냅니다.

이 같은 http_send_file()으로 if(file_exists($transfile)) 블록을 교체 :

http_send_file($transfile); 

코드는 알 버그 가볍고 덜 prown입니다 ... 무엇보다, pecl_httphttp_throttle()

처럼 무료 보너스 기능을 가지고 당신을 제공합니다 희망이 도움이!

+0

이 문제는 타사 모듈을 사용한다는 것과 모듈이 컴파일되지 못한다는 것입니다. – Enverex

+0

@Enverex : 당신은 무엇을 컴파일하려고 했습니까? 때로는 PHP 헤더 패키지가 필요합니다. Ubuntu에서 필요한 명령에 대한이 게시물을 참조하십시오. http://www.php.net/manual/en/http.install.php#81371 –

+0

Arch AUR에서 pecl-http 패키지를 사용하려고합니다. http_message_object.c : 517 : 2 : error : 'zend_class_entry'에 'default_properties'라는 이름의 멤버가 없습니다 - 가장 안정적인 버전 (1.7.1)입니다. – Enverex

관련 문제