带有睡眠循环的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直到循环结束才更新数据库的主要内容,如果未能解决你的问题,请参考以下文章