2012-08-30 3 views
2

나는 JWPlayer에 파일을 제공하기 위해 PHP 스크립트를 사용하여 거머리가 URL을 받고 iPhone 및 Roku 앱에서 사용되는 것을 방지합니다. 그래서 나는 videoplay.php? id = myfile을 호출합니다. 출력은 mp4 비디오 스트림입니다. 파일은 일반적으로 200-500MB입니다.PHP에서 리소스 사용을 최적화하는 방법 readfile()

PHP 스크립트가 올바르게 작동하고 일부 조정을하면 초기 버전보다 훨씬 나은 성능을 발휘합니다. 그러나 그것은 자원 돼지입니다. 한 파일을 스트리밍 할 때 브라우저의 다른 창을 같은 웹 사이트의 다른 페이지로 열 수 없습니다 ... 현재 페이지의 소스를 표시 할 수도 없습니다. 플레이어에게 직접 URL을 제공하여 똑같은 동영상 파일을 재생할 경우 리소스가 문제가 없으며 동영상이 재생되는 동안 페이지의 소스를 볼 수 있으며 동일한 브라우저에서 동일한 웹 사이트에서 동시에 두 개의 동영상을 재생할 수 있습니다 (2 개의 다른 페이지에).

여기에 내 코드

// some code to query database and get the file url 
// 
$fh = fopen($filename, "rb") or die("Could not open movie\n"); 

while (!feof($fh) && connection_status() == 0) 
{ 
    print(fread($fh, 1024*8)); 
    flush(); 
    ob_flush(); 
    usleep(10000); 
} 

fclose($fh); 

내가 리소스 사용을 제한하려고하는 usleep를 추가하고 작동하지 않았다, 그러나 비디오는 빠르게로드 할 것 같다. 수면 시간을 오래 사용하면 (예 : 1/10 초) 동영상을로드하는 데 시간이 오래 걸릴 수 있습니다. 청크 크기를 1024 * 4에서 1024 * 16으로 변경하면 8kbyte는 비디오로드 시간이 가장 빠른 것 같습니다. 16kbyte는 더 많은 리소스를 사용하며 내 25MBit 연결을 최대한 활용합니다. 내 로컬 서버에서 동영상이 전혀로드되지 않습니다 (하지만 클라우드 서버의 원격 동영상은로드됩니다). 청크 크기를 1KB로 줄이면 자원 문제가 해결되지 않습니다.

내가 뭘 잘못하고 있니?

+1

해당 페이지에서 세션을 사용합니까? 로드 중일 때 사이트의 다른 페이지를로드 할 수없는 세션 잠금 문제 일 수 있습니다. – Maerlyn

+0

예, 세션을 사용합니다. 나는 그것을 닫으려고 노력할 것이다. –

답변

3

아마도 이것은 session_write_close()의 사용을 놓치고 있기 때문입니다. 스트리밍 시작 부분에 함수 호출을 추가하십시오. 스크립트가 서로를 기다리기 때문에 세션 잠금이 계속 될 수 있기 때문에 세션 잠금이 계속 될 수 있습니다.

+0

정상적으로 작동합니다. 하지만 session_write_close()를 호출하면 모든 변수를 추가하거나 업데이트 할 수 없습니까? –

+0

예,'session_write_close()'를 호출 한 후에'$ _SESSION'의 변경 사항은 저장되지 않습니다. – mauris

관련 문제