使用 php 进行视频流式传输。为什么反应慢?
Video streaming with php. Why is the response slow?
我有一个大问题。我有一个视频流媒体网站。本站有public和私密视频,私密视频购买后即可看到。
这里可以看到目录结构:
/public_html
|__/vendor
|__/src
|__/public
|__/product
|__/sample-video
|__/video.mp4
好吧,如您所见,视频位于 public 文件夹之外。目标是让它们无法直接访问。
这是树枝:
<video id="myVideo">
<source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/webm" />
<source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/mp4" />
</video>
视频控制器:
https://pastebin.com/sne1mSHH
以及视频流逻辑:
https://pastebin.com/2Sxd7Nqq
这是问题所在:
我要去现场。您在页面之间切换。非常好。我转到一个视频仍然不错的页面,但在我开始播放视频后,该页面效果不佳。该页面只是加载但什么都不做。我不能再在页面之间切换了。我必须关闭隐身模式并开始新会话。
直到现在我还以为是会话锁的问题,但我关闭了写入会话。
我尝试在新标签页中打开视频。另外错误是直到视频流结束,页面不处理请求。
所以当视频正在播放时,我无法发送新请求。
我还能附加什么使错误更透明?
请帮忙!
我个人不会使用 PHP 来流式传输视频。问题是您必须锁定许多 PHP 进程以读取和流式传输大文件而不是处理逻辑。在此过程中,您还将遇到 PHP 超时。
相反,我会使用 Sendfile 模块:
您为您的网络服务器安装了一个 Apache 模块或其他类型的 Sendfile 模块,NGINX 或其他。
在 PHP 中,您执行保护逻辑,只需发送一个 HTTP header 来表示您想要 Sendfile 处理流。这样你的 PHP 代码就会停止 运行 并且它是处理文件传输的网络服务器。
像这样:
<?php
if (has_access_to_the_video($file))
{
// Send the right HTTP headers.
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Content-type: ' . mime_content_type($file));
header('Content-Length: ' . filesize($file));
// Make sure you have X-Sendfile module installed on your server.
header('X-Sendfile: ' . $file);
exit;
}
else
{
// Generate your 403 error or whatever.
}
这可能对您有帮助:
https://symfony.com/doc/current/components/http_foundation.html然后在页面中搜索sendfile
。
-
-
https://www.h3xed.com/programming/how-to-use-x-sendfile-with-php-apache
关于您的视频源的另一评论
对于 <video>
标记,您声明了两个 <source>
元素,一个带有 type="video/webm"
,另一个带有 type="video/mp4"
,但都指向相同的 URL.在您的 PHP 逻辑中,我没有看到对所需内容类型的任何处理,因此 您的服务器可能为两种编解码器返回相同的视频文件,这是有问题的 。我会在 URL 和服务器端添加视频内容类型,使用 Sendfile 进行内部重定向到正确的文件(MP4、OGG、WEBM 等)。如果浏览器请求 WEBM
文件并收到 MP4 H.264
,我认为它不会正确加载。
似乎 MP4 H.264
被 know 广泛处理,因此您可以只使用一个来源。在此处查看当前支持:
我有一个大问题。我有一个视频流媒体网站。本站有public和私密视频,私密视频购买后即可看到。
这里可以看到目录结构:
/public_html
|__/vendor
|__/src
|__/public
|__/product
|__/sample-video
|__/video.mp4
好吧,如您所见,视频位于 public 文件夹之外。目标是让它们无法直接访问。
这是树枝:
<video id="myVideo">
<source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/webm" />
<source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/mp4" />
</video>
视频控制器: https://pastebin.com/sne1mSHH
以及视频流逻辑: https://pastebin.com/2Sxd7Nqq
这是问题所在:
我要去现场。您在页面之间切换。非常好。我转到一个视频仍然不错的页面,但在我开始播放视频后,该页面效果不佳。该页面只是加载但什么都不做。我不能再在页面之间切换了。我必须关闭隐身模式并开始新会话。
直到现在我还以为是会话锁的问题,但我关闭了写入会话。
我尝试在新标签页中打开视频。另外错误是直到视频流结束,页面不处理请求。
所以当视频正在播放时,我无法发送新请求。 我还能附加什么使错误更透明? 请帮忙!
我个人不会使用 PHP 来流式传输视频。问题是您必须锁定许多 PHP 进程以读取和流式传输大文件而不是处理逻辑。在此过程中,您还将遇到 PHP 超时。
相反,我会使用 Sendfile 模块:
您为您的网络服务器安装了一个 Apache 模块或其他类型的 Sendfile 模块,NGINX 或其他。
在 PHP 中,您执行保护逻辑,只需发送一个 HTTP header 来表示您想要 Sendfile 处理流。这样你的 PHP 代码就会停止 运行 并且它是处理文件传输的网络服务器。
像这样:
<?php
if (has_access_to_the_video($file))
{
// Send the right HTTP headers.
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Content-type: ' . mime_content_type($file));
header('Content-Length: ' . filesize($file));
// Make sure you have X-Sendfile module installed on your server.
header('X-Sendfile: ' . $file);
exit;
}
else
{
// Generate your 403 error or whatever.
}
这可能对您有帮助:
https://symfony.com/doc/current/components/http_foundation.html然后在页面中搜索
sendfile
。https://www.h3xed.com/programming/how-to-use-x-sendfile-with-php-apache
关于您的视频源的另一评论
对于 <video>
标记,您声明了两个 <source>
元素,一个带有 type="video/webm"
,另一个带有 type="video/mp4"
,但都指向相同的 URL.在您的 PHP 逻辑中,我没有看到对所需内容类型的任何处理,因此 您的服务器可能为两种编解码器返回相同的视频文件,这是有问题的 。我会在 URL 和服务器端添加视频内容类型,使用 Sendfile 进行内部重定向到正确的文件(MP4、OGG、WEBM 等)。如果浏览器请求 WEBM
文件并收到 MP4 H.264
,我认为它不会正确加载。
似乎 MP4 H.264
被 know 广泛处理,因此您可以只使用一个来源。在此处查看当前支持: