Php Apache不适用于HTTP\u范围?

Php Apache不适用于HTTP\u范围?,php,apache,http,http-headers,streaming,Php,Apache,Http,Http Headers,Streaming,我想创建一个.php文件,用于流式传输视频! 现在的问题是,只有当我使用普通的readfile()时,它才能工作,但是,你不能在视频中来回移动,所以我在谷歌上搜索,找到以下代码: (基本上,HTTP_范围不起作用,从不,我不知道为什么,在测试它时,它总是触发我的die(“lol?”);因此它显然出于某种原因不支持它) (die()函数是故意放在那里的,如果它能工作,它将被取出.) (请注意,我将“$size=filesize($file);”更改为“$size=filesize(“.”$file

我想创建一个
.php
文件,用于流式传输视频! 现在的问题是,只有当我使用普通的readfile()时,它才能工作,但是,你不能在视频中来回移动,所以我在谷歌上搜索,找到以下代码:

(基本上,
HTTP_范围
不起作用,从不,我不知道为什么,在测试它时,它总是触发我的
die(“lol?”)
;因此它显然出于某种原因不支持它) (die()函数是故意放在那里的,如果它能工作,它将被取出.)

(请注意,我将“
$size=filesize($file);
”更改为“
$size=filesize(“.”$file);
”,因为有人提到这是必需的,而“filesize($file);”对我来说无论如何都不起作用,它总是会引发错误)

(并且,$文件显示了我的文件的实际路径,没有替换,它在我的原始php中的外观!)

所以我想问你们,我怎样才能解决这个问题?我真的很想用php来流式传输我的视频,因为安全原因,而且因为我喜欢它,我已经用这种方法来处理图像了,但它是一种不同的代码(并且可以工作)

我正在将Apache 2.4(Windows 10-64位PC)与最新版本的PHP7一起使用,但Apache似乎不支持HTTP_RANGE?我是否遗漏了一些东西,在php.ini或httpd.conf中是否需要启用一些东西


提前谢谢你,我希望有人能告诉我该怎么做,因为我真的被困在这里了,我尝试了在谷歌上找到的所有mp4视频流的例子,但没有一个对我有效://

这有两个部分:

  • 浏览器/客户端发出的请求。这必须发送适当的请求头
  • 服务器给出的响应。这是由PHP脚本完成的,还必须发送相应的响应头
尝试流式传输视频(或任何内容)时,请在浏览器中打开“网络”选项卡

查看请求头(在Chrome中,这在网络选项卡下)。我在下面贴了一张截图。请注意,在请求中有一个
范围:
参数。如果请求中没有此项,您将遇到问题。这就是告诉服务器上的PHP脚本您首先正在执行范围请求的原因。如果服务器在请求中没有看到这个头,那么它将绕过
If
语句,进入
die

请注意,默认情况下,
范围:
请求头通常不包括在请求中,因此除非您指定此范围,否则它将永远不会工作。如果在“网络”选项卡上的“请求头”中看不到它,则它不存在,您需要修复它

您可能还想检查响应头-它与请求头完全不同。同样,可以在浏览器的“网络”选项卡中看到这些内容。有关必须设置的相应标题,请参见下文:


回到最初的问题,所有这些都与回答无关(这就是你所描述的)。您遇到的最初问题与您如何发出请求以及它不包含
范围:
头(当它必须这样做时)这一事实有关。

因此,它可能进入
模具
部分的唯一原因是因为未设置
$\u服务器['HTTP\u范围]
。但这来自用户代理发出的请求,因此不能保证@苏安迪?我对php、apache等都没有经验,有什么解决方案?我在google chrome和internet explorer中进行了测试!如果您对Apache/PHP缺乏经验,那么恐怕您不大可能实现这一点。这里有一个很好的概述:。您需要了解,它不仅基于服务器给出的响应,还非常基于从客户端发送的请求头。您在代码中没有显示您是如何发出请求的,这是我怀疑问题可能的所在。@Andywell,我可以非常向您保证,我知道如何设置内容头,并且它不会使它工作,我尝试设置te accept范围、内容类型、内容长度等,但是,由于所有这些方法对我也不起作用,我认为这不会有什么不同,因此,为什么在我的这篇文章中显示的代码中不包含themTry this:。如果该脚本的输出为“否”,那么您没有正确设置请求头。你从中得到了什么?非常感谢,我会读更多关于它的文章,也许我可以让它工作!
<?php
// Clears the cache and prevent unwanted output
ob_clean();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 'Off');

$file = "/cdn4-e663/zw4su8jiy8skgvizihsjehj/2038tkusi9u848sui7zh/2q3z6hjk97ujduz/a1-cdn/9zw35jbmhkk47wi63uu7.mp4"; // The media file's location
$mime = "application/octet-stream"; // The MIME type of the file, this should be replaced with your own.
$size = filesize(".".$file); // The size of the file

// Send the content type header
header('Content-type: ' . $mime);

// Check if it's a HTTP range request
if(isset($_SERVER['HTTP_RANGE'])){
    // Parse the range header to get the byte offset
    $ranges = array_map(
        'intval', // Parse the parts into integer
        explode(
            '-', // The range separator
            substr($_SERVER['HTTP_RANGE'], 6) // Skip the `bytes=` part of the header
        )
    );

    // If the last range param is empty, it means the EOF (End of File)
    if(!$ranges[1]){
        $ranges[1] = $size - 1;
    }

    // Send the appropriate headers
    header('HTTP/1.1 206 Partial Content');
    header('Accept-Ranges: bytes');
    header('Content-Length: ' . ($ranges[1] - $ranges[0])); // The size of the range

    // Send the ranges we offered
    header(
        sprintf(
            'Content-Range: bytes %d-%d/%d', // The header format
            $ranges[0], // The start range
            $ranges[1], // The end range
            $size // Total size of the file
        )
    );

    // It's time to output the file
    $f = fopen($file, 'rb'); // Open the file in binary mode
    $chunkSize = 8192; // The size of each chunk to output

    // Seek to the requested start range
    fseek($f, $ranges[0]);
    die("working?");
    // Start outputting the data
    while(true){
        // Check if we have outputted all the data requested
        if(ftell($f) >= $ranges[1]){
            break;
        }

        // Output the data
        echo fread($f, $chunkSize);

        // Flush the buffer immediately
        ob_flush();
        flush();
    }
}
else {
    die("lol?");
    header('Content-Length: ' . $size);

    // Read the file
    readfile($file);

    // and flush the buffer
    ob_flush();
    flush();
}
?>
if(isset($_SERVER['HTTP_RANGE'])){ 
   /*function fires or not, and no, as it seems it returns FALSE every time..8/ 
}