0

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

我在最后添加了一个回声只是为了验证,并且回声不会出现在页面上,直到每个循环都同时回显。

我还尝试在 echo 之后放置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 循环
任何建议,将不胜感激。我已经通过搜索并没有找到有类似问题的用户,但我找不到答案。

4

3 回答 3

1

您可以让这些回显一一显示,但在受控环境中(根据 php 文档,flush 可能仍会缓冲多个 Win32 系统上的输出),您可以在php flush 手册页中进一步阅读。

更具体地说,请确保禁用 APaches mod_gzip,此外,一些 php.ini 设置(如 output_buffering 和 zlib.output_compression)应设置为 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

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

于 2012-11-27T16:33:08.547 回答
1

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

于 2012-11-27T16:51:58.373 回答
0

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

每 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。以上工作并解决了我的问题。

于 2012-11-28T23:22:59.703 回答