1

我正在尝试从读卡器捕获实时提要并使用 PHP 打印它。

<?php
    $i=0;
    for(;;)
    {
        $subdata=file_get_contents("/home/openflow/subscribedata.txt");
        $subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt");

        if($subdata!=$subdata2)
        {
            copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt");
            $sub=file_get_contents("/home/openflow/subscribedata.txt");
            $i++;
            echo "\n". $i."--".$sub;
        }
    }
?>

我将 for 循环用作无限循环。每当有新数据时,我的读卡器脚本就会将其写入subscribedatatemp.txt文件,上面的脚本会检查subscribedatatemp.txt(最新条目)和subscribedata.txt(上一个条目)之间的差异。如果有差异,它应该将最新的复制到以前的并回显最新的数据。

问题是当我执行上面的 PHP 代码时,它有一段时间没有显示任何内容,一段时间后浏览器停止加载并显示它在加载时获得的所有数据。

这表明循环执行正在停止,并且在 while 循环结束后正在打印所有数据,对吗?我该如何纠正?

4

4 回答 4

0

在代码的顶部,添加以下行:

set_time_limit(0);

所以你的整个代码看起来像这样:

<?php
set_time_limit(0);
$i=0;
for(;;)
{
$subdata=file_get_contents("/home/openflow/subscribedata.txt");
$subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt");

if($subdata!=$subdata2)
{
copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt");
$sub=file_get_contents("/home/openflow/subscribedata.txt");
$i++;
echo "\n". $i."--".$sub;
}
}
?>

set_time_limit() 在此处阅读更多信息。

另外,检查max_execution_time您的php.ini文件中是否未设置。

于 2013-05-21T18:03:42.850 回答
0

用于set_time_limit()防止脚本超时,方法是0在脚本开头传入 a 以使其无限等待。

您还想在sleep()循环中添加一个,这样它就不会消耗所有的 CPU 周期。

最后,您需要flush()在每个循环的末尾添加 a 以清空缓冲区并将其发送到客户端。

<?php
// set an infinite timeout
set_time_limit(0);
// create an infinite loop
while (true) {
    // do your logic here
    $subdata=file_get_contents("/home/openflow/subscribedata.txt");
    $subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt");
    // .... etc.

    // flush buffer to the client
    flush();

    // go to sleep to give the CPU a break
    sleep(100);
}
?>
于 2013-05-21T18:11:50.843 回答
0

如果我对您的理解正确,您会尝试在每个循环之后显示输出(而不是等待整个脚本结束),因此为了 echo( flush) 每个循环,您需要flush()在循环结束时添加.

此外,我们将set_time_limit(0)在循环之前添加,因此我们的脚本需要时间来执行。

<?php
set_time_limit(0);
ob_end_flush();


$i=0;
for(;;)
{
$subdata=file_get_contents("/home/openflow/subscribedata.txt");
$subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt");

if($subdata!=$subdata2)
{
copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt");
$sub=file_get_contents("/home/openflow/subscribedata.txt");
$i++;
echo "\n". $i."--".$sub;
/*flush()*/
}

}
ob_start();
?>
于 2013-05-21T18:13:13.793 回答
0

在循环结束时使用flush和函数...sleep

但最好为此使用ajax调用..

于 2013-05-21T18:17:15.540 回答