无法在php ajax中的while()循环中打印

时间:2011-09-15 16:50:23

标签: php loops printing status flush

我正在尝试通知用户,后台运行的(另一个)脚本的状态(每分钟运行一次)。

所以我有这个PHP代码:     

    while(@fopen("dl.conf","r")){ 
      print "Download will start soon";
      flush();
      sleep(1);
    }
    .
    .

它不会打印任何内容,即使我取消该文件也不会执行其余的脚本。

基本上用户可以提交文件进行下载。这将触发创建文件dl.conf。有一个脚本在后台运行,检查dl.conf是否存在,如果是,则读取它,然后开始下载。它也会删除dl.conf文件。

用户可能会提交下载但脚本将需要几秒钟才能再次运行,并意识到有一些东西需要下载。所以我只想让用户等待即将开始的下载(然后会显示下载进度)。

谢谢

3 个答案:

答案 0 :(得分:0)

您无需使用fopen()来检查文件是否存在,您可以像这样使用file_exists()

// run loop till file exists
while(file_exists("dl.conf")){ 
    print "Download will start soon";
    flush();
    sleep(1);

    // clear stat cache to get correct file status
    clearstatcache();
}

如果后台脚本也是PHP脚本并使用unlink()删除dl.conf文件,则不需要clearstatcache()调用。由于unlink()自动清除文件统计缓存。

<强>更新

有时flush()或ob_flush不起作用。请查看有关PHP文档http://php.net/manual/en/function.ob-flush.php#90529

的评论

因此,如果您确实使用output_buffering,则可以尝试这组命令。

ob_end_flush(); 
ob_flush(); 
flush(); 
ob_start(); 

答案 1 :(得分:0)

嗯,你阻止了错误。

试试这个:

$fOpen = @fopen("dl.conf","r");

if(!$fOpen) die('ERROR of some kind...');

while($fOpen){ 
  print "Download will start soon";
  flush();
  sleep(1);
}

答案 2 :(得分:0)

你最好在这种情况下使用ajax并改变它 应该在ajax onresponse事件中处理的脚本

if(file_exists('dl.conf'))
{
 return 'file created, download will start soon';
}