2

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

php 脚本工作正常,经过一些调整,它的性能甚至比我最初的版本好得多。但它是一个资源猪。当我流式传输一个文件时,我无法在浏览器中打开另一个窗口到同一网站上的任何页面......我什至无法显示当前页面的源代码。如果我通过将 url 直接提供给播放器来播放完全相同的视频文件,我没有资源占用问题,我可以在视频播放时查看页面的源代码,并在同一浏览器中同时播放来自同一网站的两个视频(在两个不同的页面上)。

这是我的代码

// 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 并没有解决资源问题。

我究竟做错了什么?

4

1 回答 1

3

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

于 2012-08-30T19:29:15.513 回答