【问题标题】:Cannot print in while() loop in php ajax无法在 php ajax 的 while() 循环中打印
【发布时间】:2011-09-15 16:50:22
【问题描述】:

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

所以我有这个 php 代码:

而(@fopen(“dl.conf”,“r”)){ print "即将开始下载"; 冲洗(); 睡眠(1); } . .

它不打印任何东西,而且即使我取消该文件,它也不会执行脚本的其余部分。

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

可能会发生这样的情况:用户提交了下载,但脚本需要几秒钟才能再次运行,并意识到有东西要下载。所以我只希望用户等待很快就会开始的下载(然后会显示下载进度)。

谢谢

【问题讨论】:

  • 您的代码中存在解析错误。
  • 没有解析错误,我只是运行了这段代码,没有显示错误
  • 奇怪我没有得到任何解析错误。你能告诉我错误是什么吗?

标签: php loops printing status flush


【解决方案1】:

你阻止了错误。

试试这个:

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

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

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

【讨论】:

  • 很抱歉,我得到了同样的行为。没有打印任何内容。
  • @Danny -- 你是否打开了 php 错误和错误日志记录?
  • 是的,我刚刚检查过,我打开了 display_errors 和 log_errors。 error_reporting = E_ALL | E_STRICT
  • @Danny 删除@ 之前的fopen
  • 如果我删除 @ 没有任何改变。另外,我注意到 dl.conf 永远不会以这种方式被删除。它是打开的,需要一个 close()
【解决方案2】:

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

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

【讨论】:

  • 其实是用ajax处理的,忘了说了。此代码是显示进度条的脚本的一部分。无论如何,我需要一个循环或不会让脚本继续运行的东西,否则它将用其他东西替换我写的任何消息。
  • 响应将被缓冲并且不会在脚本仍在运行时发送到输出,您可以尝试在 php.ini 中使用 ob_flush() 函数或相关配置选项,但我认为它不是选项
  • 这个问题也可能有帮助stackoverflow.com/questions/6385676/…
【解决方案3】:

你不需要使用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(); 

【讨论】:

  • 很抱歉,我得到了同样的行为。什么都没有打印。我不能使用 unlink() 因为这个 php 脚本不负责删除 dl.conf。它不知道什么时候删除它
  • 如果没有输出,则表示file_exists() 正在返回 false。在 while 循环之前尝试 var_dump(file_exists("dl.conf")) 以检查返回值是什么。
  • var_dump(file_exists("dl.conf"))的输出是什么
  • 布尔真,当文件存在时。否则为假。无论如何,我必须删除 while 循环才能打印。即使我把它放在循环之前。
  • 如果输出为真,则应该运行while() 循环。如果一次都没有执行,则说明dl.conf文件在到达while()循环之前已经被上传脚本删除了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多