我正在尝试通知用户,后台运行的(另一个)脚本的状态(每分钟运行一次)。
所以我有这个PHP代码:
while(@fopen("dl.conf","r")){ print "Download will start soon"; flush(); sleep(1); } . .
它不会打印任何内容,即使我取消该文件也不会执行其余的脚本。
基本上用户可以提交文件进行下载。这将触发创建文件dl.conf。有一个脚本在后台运行,检查dl.conf是否存在,如果是,则读取它,然后开始下载。它也会删除dl.conf文件。
用户可能会提交下载但脚本将需要几秒钟才能再次运行,并意识到有一些东西需要下载。所以我只想让用户等待即将开始的下载(然后会显示下载进度)。
谢谢
答案 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';
}