带有睡眠循环的PHP直到循环结束才更新数据库

Posted

技术标签:

【中文标题】带有睡眠循环的PHP直到循环结束才更新数据库【英文标题】:PHP while with sleep loop not updating database until end of loop 【发布时间】:2012-11-15 07:32:03 【问题描述】:

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

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

我还尝试将 ob_flush()flush() 放在 echo 之后,但没有成功。

脚本

$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 循环。 任何建议,将不胜感激。我已经通过搜索,没有找到有类似问题的用户,但我找不到答案。

【问题讨论】:

不能一一得到回声。 php 所做的是一次输出整个内容,而不是一次输出一部分。因此,您将在屏幕上看到输出之前等待 sleep() 秒数。 如果 PHP 只在最后返回输出,您是否建议有一个秒脚本循环调用此页面(每 5 秒调用一次页面)? 这是一种方法,但我不知道你的实际目标是什么。做某事总是有不止一种方法,你应该描述你拥有什么和你想要什么,也许你会从其他人那里得到有用的意见:) 你确定它会在所有 10 个循环都完成后更新数据库吗?还是您只看到数据库中的最后一次更新?一个 while 在另一个循环内循环是否正确? $result 来自哪里? 好问题。每次更新时,数据库中都有一个时间戳,因此我可以在页面循环时监控更新。循环结束时的回声也只在所有循环之后返回 ech。我还尝试使用 FOR 循环,然后使用 WHILE 循环,没有任何变化。 【参考方案1】:

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

更具体地说,请确保禁用 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

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

【讨论】:

感谢您的信息。我决定使用 bash 脚本每 5 秒运行一次 PHP 脚本,而不是依赖于清除 PHP 中的大缓冲区。不过,这很高兴知道:)【参考方案2】:

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

【讨论】:

这是真的。之前没有注意到。感谢您纠正这一点。如果 PHP 不会等到脚本结束才回显所有内容,那么我肯定需要解决这个问题。【参考方案3】:

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

【讨论】:

以上是关于带有睡眠循环的PHP直到循环结束才更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

带有 sleep() 的 php 输出

在开始睡眠(或直到脚本结束)之后对象输出的奇怪延迟

Promise resolve() 被调用,但直到它被调用的循环终止才解决

执行 PHP 循环直到数组结束或达到一定的迭代次数?

需要精确的线程睡眠。最大 1ms 错误

MFC编辑框数据实时更新问题!!求解答!!!