繁体   English   中英

PHP的睡眠和MySQL不相处

[英]PHP Sleep and mysql not getting along

我有一个可以运行一次的程序,但是当我在后台运行它时却执行失败,而该程序带有包含sleep(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。

有什么想法吗?

我想我发现了一些可以说明我的问题的信息: http : //php.net/manual/en/mysqli.close.php的注释。 我正在考虑解释的问题,如果不能解决。 我实际上是通过在每次程序运行时创建和销毁db链接来解决的。 我希望这很简单,没有太大的开销。

至少在PHP5.3.2和Windows通过tcp连接的情况下,这与旧的mysql_close()函数的不同之处在于,它实际上并未关闭正在使用的tcp套接字。 在mysqli_close()之前,您应该始终使用mysqli_kill()函数来实际关闭和释放PHP使用的tcp套接字。 脚本执行后的垃圾收集或mysqli_close()都不会自行杀死tcp套接字。 否则,套接字将保持在“等待”状态约30秒,并且任何其他页面加载/连接尝试只会增加打开的tcp连接的总数。 此等待时间似乎无法通过PHP设置进行配置。

在您的评论中,您说过,您想使用计时器来控制函数执行之间的数据同步。

Cron工作是更可靠的方法。 您要实施的东西是一个丑陋的解决方案。

在您的情况下应该使用的技巧:

1)创建一个每分钟运行一次的cron,并执行邮件逻辑。

2)将表“ cron_locks”添加到具有名称列的数据库。 当您的cron启动时,您会按名称检查该表中是否有一行。

3)如果设置了锁定,则应跳过cron。 如果未设置锁定-则进行设置。

4)在函数末尾,您从db中删除了锁。

如果我不够清楚,请询问我进一步的解释。 我相信这是解决您问题的正确方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM