我有一个带有睡眠功能的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循环 任何建议,将不胜感激。我已经完成了搜索,但没有找到类似问题的用户,但我找不到答案。
答案 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。以上工作并解决了我的问题。