PHP使用睡眠循环时不更新数据库直到循环结束

时间:2012-11-27 16:09:40

标签: php loops while-loop sleep flush

我有一个带有睡眠功能的while循环,我不想运行 - >更新数据库 - >睡觉 - >再跑10次。使用下面的脚本,脚本循环10次,但它只在所有10个循环完成时更新数据库。

我在最后添加了一个回声来验证,并且在每个循环立即被回显之前,回显没有出现在页面上。

我还尝试在回声之后放置 ob_flush() flush(),但没有运气。

脚本

$loops = 10;
while ($loops > 0)
{
  while($row = mysql_fetch_array($result))
  {
    // Get current User status
    $username = $row['username'];
    $user_status = $row['user_status'];
    $user_updated = date('Y-m-d H:i:s');

    // Update database
    $update_sql = "UPDATE  `database`.`user` SET  `user_status` =  '$user_status',
                                                  `user_updated` =  '$agent_updated'
                                            WHERE  
                                                  `user`.`username` =  '$username'";
    $update=mysql_query($update_sql);
    echo "Loop #".$loops."<br>";
  }
flush();
$loops--;
Sleep(5);
}

我也尝试了 FOR循环 任何建议,将不胜感激。我已经完成了搜索,但没有找到类似问题的用户,但我找不到答案。

3 个答案:

答案 0 :(得分:1)

你可以逐个显示这些回声,但是在受控环境中(根据php文档,flush可能仍然缓冲几个Win32系统上的输出),你可以在php flush manual page中进一步阅读。 / p>

更具体地说,确保禁用了APaches mod_gzip,同时,一些像output_buffering和zlib.output_compression这样的php.ini设置应设置为false。

output_buffering = false
zlib.output_compression = false

即便如此,您可能还需要发送“大量”数据(如2048个字符),以便让某些浏览器实际显示新数据。

echo "One"
echo str_repeat(" ", 2048);
Sleep(3)
echo "Two"
echo str_repeat(" ", 2048);
// Ans so on

在上述手册页的评论中,您可以看到更多示例。

答案 1 :(得分:1)

根据提供的代码,似乎所有更新都在第一个循环中完成,然后mysql_fetch_array($ result)仅返回falses并且内部循环不会在其他主循环中再次进行,除非您填充$ result再次(在循环标题之间)。

答案 2 :(得分:0)

正如N.B.指出的那样,PHP只在脚本运行后一次性返回结果,我已经用以下解决方案结束了:

每5秒运行一次PHP页面的bash.sh脚本:

#!/bin/bash

set -e
count=1
while [ $count -le 12 ] :
do
  # run this scripts for one minute (12 times every 5 seconds = 60 seconds)
  /usr/bin/php -q thescript.php
  (($count++))
sleep 5
done

然后是每分钟运行页面的cronjob。以上工作并解决了我的问题。