如何在PHP中通过URL验证M3U8/TS视频状态且不加载内容
如何用PHP仅检查M3U8/TS视频的可用性(避免加载完整内容)
问题背景
我尝试用PHP通过URL判断M3U8或TS视频是否可用,但当前代码会请求并加载完整的流内容,而我只需要获取视频是否可访问的状态:
- 视频不可用时,响应显示无内容可加载
- 视频可用时,现有代码会自动加载全部内容,而非仅获取状态
现有代码
<?php function isVideoUp($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return ($httpCode >= 200 && $httpCode < 300); } $url = 'http://example.com/test.m3u8'; if (isVideoUp($url)) { echo "The video is up!"; } else { echo "The video is down or inaccessible."; } ?>
解决方案
要避免加载完整内容,只需发送HEAD请求而非GET请求——HEAD请求仅返回响应头,不会返回响应体。同时添加超时设置、重定向处理,进一步优化请求效率和准确性:
修改后的代码:
<?php function isVideoUp($url) { $ch = curl_init($url); // 发送HEAD请求,仅获取响应头 curl_setopt($ch, CURLOPT_NOBODY, true); // 无需返回响应内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 跟随重定向,处理视频URL的跳转情况 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 设置超时时间,避免请求挂起 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 2xx状态码表示直接可用,3xx重定向到有效资源也视为可用 return ($httpCode >= 200 && $httpCode < 400); } $url = 'http://example.com/test.m3u8'; if (isVideoUp($url)) { echo "视频可访问!"; } else { echo "视频不可用或无法访问。"; } ?>
关键修改说明
CURLOPT_NOBODY => true:核心设置,让curl只发送HEAD请求,不加载流内容- 超时配置:避免因网络问题导致请求长时间阻塞
- 重定向处理:覆盖视频URL通过跳转提供资源的场景,保证判断准确
- 状态码范围调整:将有效状态码扩展到200-399,兼容合法的重定向资源
内容的提问来源于stack exchange,提问作者Abdelrahman Ashraf
相关产品推荐
相关产品推荐

