PHP Readfile()用户中止时的字节数
我正在使用PHP脚本从远程源流式传输实时视频(即永不结束的文件)。输出在VLC中查看,而不是在web浏览器中查看。我需要记录传输的字节数。这是我的密码: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
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不会改变任何内容。按下停止按钮后,我的文本文件仍无法写入。