如何使用PHP readfile()优化资源使用

时间:2012-08-30 19:26:42

标签: php streaming video-streaming jwplayer fread

我正在使用php脚本向JWPlayer提供文件,以防止水蛭获取URL并在iPhone和Roku应用程序中使用它。所以我打电话给videoplay.php?id = myfile。输出是mp4视频流。文件通常为200-500MBytes。

php脚本正常工作,并且通过一些调整它甚至比我的初始版本执行得更好。但这是一种资源匮乏。当我正在流式传输一个文件时,我无法在浏览器中打开另一个窗口到同一网站上的任何页面...我甚至无法显示当前页面的来源。如果我通过直接向播放器提供网址来播放完全相同的视频文件,我没有资源问题,我可以在视频播放时查看页面的来源,并在同一浏览器中同时播放同一网站的两个视频(在两个不同的页面上。)

这是我的代码

// 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连接。视频不会从我的本地服务器加载(但我们的云服务器上的远程视频会加载)。将块大小减少到1kbyte并没有解决资源问题。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

这可能是因为你错过了session_write_close()的使用。将函数调用添加到流的开始。会话锁定可能是您的脚本的原因,因为脚本在继续之前等待彼此完成。