PHP守护进程长时间连接MariaDB导致程序自动退出

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/128/ ]

先前写了几个PHP的守护进程,其中一个实时往MariaDB数据库写数据,一开始运行的都还可以,但是渐渐地就发现,与MariaDB交互的PHP守护进程,经常自己挂掉,尤其是用户量少的时候(很神奇),每隔一天就得重新手动运行.

先前写了几个PHP的守护进程,其中一个用于实时往MariaDB数据库写数据,一开始运行的都还可以,但是渐渐地就发现,与MariaDB交互的PHP守护进程,经常自己挂掉,尤其是用户量少的时候(很神奇),每隔一天就得重新手动运行。

PHP守护进程逻辑代码如下:

<?php
while(1) {
    $data = 从缓存队列中获取数据
    if( $data !== false ) {
        数据库相关操作
    } else {
        sleep(5);
    }
}

排除了PHP代码逻辑错误,或许就是PHP连接Mysql超时之类的异常了。

网上查询了关于php长时间连接mysql的资料,了解到mysql连接默认配置的超时时间为8小时,最大值也只能设置为一年。

mysql手册中也提到了变量wait_timeout:服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。

查看当前mysql数据库连接超时wait_timeout值的方式如下:

1)先登录mysql数据库

mysql -uroot -p
Enter password: (输入密码)

2)再执行查询命令

show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

单位为秒,28800秒=8小时。

其实默认设置的8小时已经足够了,想要保持永久连接与mysql的连接,只要在连接超时前,跟Mysql交互一下即可。你可以简单的想象一下,假设电脑桌面的锁屏时间为15分钟,15分钟内只要你动一动鼠标,系统就重新倒计时,防止锁屏的发生。

了解了原理就好办了,我们只要在mysql连接超时前,想办法动一动mysql的“鼠标”。这里,我用到了PHP自带的函数:mysql_ping()。

修改之后的代码如下:

<?php
$i = 0;
while(1) {
    $data = 从缓存队列中获取数据
    if( $data !== false ) {
        数据库相关操作
    } else {
        if( $i >= 1000 ) {
            $i = 0;
            mysql_ping();
        } else {
            ++$i;
        }
        sleep(5);
    }
}

这样就避免了PHP守护进程长时间连接MariaDB数据库,连接超时导致的程序崩溃。

    评论:

    1. 互传站长网 回复2014年08月21日 20时34分
      磨者
      看着你的网站一天天进步 很不错 继续加油 也欢迎你来见证我的进步

        磨延城 @互传站长网 回复2014年08月27日 08时58分

        呵呵,相互关注,一起加油,也祝贵站越做越大。

    2. 撒哈拉的小猫 回复2015年03月12日 20时46分
      磨者
      原先有个客户网站请求要多了,又不想升级,就想用守护进程做个网站排队功能。。
      你网站评论表单应该做个cookie啊。。不然每次都要输入哎。

    3. unknown 回复2015年06月04日 15时23分
      磨者
      不错的文章,内容酣畅淋漓.禁止此消息:nolinkok@163.com
      西门塔尔牛 http://www.xmten.com/

    4. 我来说两句:

        切换  

      磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

        切换  

      磨途歌随机验证码