PHP Readfile()用户中止时的字节数

PHP Readfile()用户中止时的字节数,php,Php,我正在使用PHP脚本从远程源流式传输实时视频(即永不结束的文件)。输出在VLC中查看,而不是在web浏览器中查看。我需要记录传输的字节数。这是我的密码: <?php ignore_user_abort(true); $stream = $_GET['stream']; if($stream == "vid1") { $count = readfile('http://127.0.0.1:8080/'); logThis($count); } function logT

我正在使用PHP脚本从远程源流式传输实时视频(即永不结束的文件)。输出在VLC中查看,而不是在web浏览器中查看。我需要记录传输的字节数。这是我的密码:

<?php

ignore_user_abort(true);
$stream = $_GET['stream'];

if($stream == "vid1")
{
    $count = readfile('http://127.0.0.1:8080/');
    logThis($count);
}

function logThis($c)
{
    $myFile = "bytecount.txt";
    $handle = fopen($myFile,'a');
    fwrite($handle,"Count: " . $c . "\n");
    fclose($handle);
}

?>

然而,当用户按下停止按钮时,似乎从未调用logThis(),即使我已经输入了ignore\u user\u abort(true)

你知道我做错了什么吗

谢谢

Update2:我已经更改了代码,因为我不应该使用ignore\u user\u abort(true),因为这样即使在客户端离开后,也会继续下载文件。我已将代码更改为:

<?php

$count = 0;

function bye()
{
    //Create Dummy File with the filename of equal to count
}

register_shutdown_function('bye');
set_time_limit(0);
ignore_user_abort(false);

$stream = $_GET['stream'];

if($stream == "vid1")
{
    $GLOBALS['count'] = readfile('http://127.0.0.1:8080/');
    exit();
}

我现在的问题是,当脚本中止时(即用户按下stop),readfile不会返回值(即计数保持为0)。有没有办法解决这个问题

谢谢

当PHP脚本正常运行时,正常状态为活动状态。如果远程客户端断开连接,中止状态标志将打开。远程客户端断开连接通常是由用户按下停止按钮引起的。如果达到PHP施加的时间限制(请参阅set_time_limit()),则会打开超时状态标志

因此,将
set\u time\u limit
设置为0应该会有所帮助

当PHP脚本正常运行时,正常状态为活动状态。如果远程客户端断开连接,中止状态标志将打开。远程客户端断开连接通常是由用户按下停止按钮引起的。如果达到PHP施加的时间限制(请参阅set_time_limit()),则会打开超时状态标志


因此,将
设置时间限制
设置为0应该会有所帮助。

好的,伙计们,我设法解决了这个问题。诀窍是不使用readfile(),而是逐字节读取视频流。好的,它可能不是100%准确,但是这里或那里有几个字节不准确是可以的

<?php

$count = 0;

function logCount()
{
    //Write out dummy file with a filename equal to count
}

register_shutdown_function('logCount');
set_time_limit(0);
ignore_user_abort(false);

$stream = $_GET['stream'];

if($stream == "vid1")
{

    $filename = 'http://127.0.0.1:8080/';
    $f = fopen($filename, "rb");

    while($chunk = fread($f, 1024)) {
        echo $chunk;
        flush();
        if(!connection_aborted()) {
            $GLOBALS['count'] += strlen($chunk);
        }
        else {
            exit();
        }
    }
}

?>

好的,伙计们,我设法解决了这个问题。诀窍是不使用readfile(),而是逐字节读取视频流。好的,它可能不是100%准确,但是这里或那里有几个字节不准确是可以的

<?php

$count = 0;

function logCount()
{
    //Write out dummy file with a filename equal to count
}

register_shutdown_function('logCount');
set_time_limit(0);
ignore_user_abort(false);

$stream = $_GET['stream'];

if($stream == "vid1")
{

    $filename = 'http://127.0.0.1:8080/';
    $f = fopen($filename, "rb");

    while($chunk = fread($f, 1024)) {
        echo $chunk;
        flush();
        if(!connection_aborted()) {
            $GLOBALS['count'] += strlen($chunk);
        }
        else {
            exit();
        }
    }
}

?>

我还发现了另一种解决方案,它看起来更优雅(因为它只需恢复文件,而无需预先复制):

我还发现了另一种解决方案,它看起来更优雅(因为它只需恢复文件,而无需预先复制):

尝试添加:
设置时间限制(0)
,同时阅读以下内容可能会有所帮助!当使用中止时,readfile没有返回0-它返回布尔值false,因为用户中止是一种错误条件。只有当整个文件成功排队时,它才会返回传输的字节数。e、 g.您根本无法使用它来确定在中止发生之前发送了多少。请尝试添加:
set\u time\u limit(0)
,同时阅读以下内容可能会有所帮助!当使用中止时,readfile没有返回0-它返回布尔值false,因为用户中止是一种错误条件。只有当整个文件成功排队时,它才会返回传输的字节数。e、 g.您根本无法使用它来确定在中止发生之前发送了多少。不,抱歉,将set_time_limit添加到0不会改变任何内容。按下“停止”按钮后,我的文本文件仍无法写入。不,抱歉,将“设置时间限制”添加到0不会改变任何内容。按下停止按钮后,我的文本文件仍无法写入。