You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:58:20