我有一个在一次运行模式下运行的程序,但是当我在后台使用包含睡眠(60)延迟的do-while-true循环运行它时失败。
if ($debug || $run_once) {check_mail($domain_mail_box, $mailboxes); exit;}
else {
do {
check_mail($domain_mail_box, $mailboxes);
# sleep 60;
# exec('sleep 60'); # wait a minute after completing each run
$i=0; do { $i++; } while ($i < 3000000001);
} while (TRUE);
}
exit(0);
实际上,所有这三种让它正常工作的尝试都失败了。这很奇怪,因为我让它在另一台服务器/系统上运行得很漂亮。 (两者都是专用的CentOS盒子。)
失败是MySQL失败。作为脚本的一部分,它会写入日志。运行一次和第一次运行与延迟为mysql_stat($ Link)写这样的东西: 0:正常运行时间:605079/1:主题:2/2:问题:17458285/3:慢查询:0/4:打开:1287520/5:刷新表:1/6:打开表:1024/7:每秒查询数平均值:28.852 /
但是一旦我插入延迟,我就会感到害怕: 0:MySQL服务器已经消失/ 来自mysql_stat。
任何想法发生了什么?
答案 0 :(得分:1)
嗯。我想我已经找到了一些可以解释我的问题的信息:来自http://php.net/manual/en/mysqli.close.php的评论。我在考虑解释的问题,如果没有解决的话。我实际上只是通过在每次程序运行时创建和销毁db链接来解决问题。我希望这很简单,没有很大的开销。
至少在PHP5.3.2和Windows连接的情况下,这与旧的mysql_close()函数的区别在于它实际上并没有关闭正在使用的tcp套接字。你应该总是在mysqli_close()之前使用mysqli_kill()函数来实际关闭并释放PHP使用的tcp套接字。脚本执行后的垃圾收集和mysqli_close()都不会自行杀死tcp套接字。否则套接字将保持等待&#39;状态约30秒,任何其他页面加载/连接尝试只会添加到打开的TCP连接总数。此等待时间似乎不能通过PHP设置进行配置。
答案 1 :(得分:1)
在您的评论中,您说要使用计时器来控制函数执行之间的数据同步。
Cron的工作方式更可靠。你想要实现的是一个丑陋的解决方案。
欺骗你应该在你的情况下使用:
1)制作一个每分钟运行一次的cron,并做邮件逻辑。
2)将表'cron_locks'添加到名为column的数据库。当你的cron启动时,你会检查该表中是否有一行名称。
3)如果设置了锁定,则应跳过cron。如果未设置锁定 - 您可以设置它。
4)在函数结束时,你从db中删除锁。
如果我不够清楚,请向我询问进一步的解释。我相信这是解决问题的正确方法。