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. 磨者 944 回复2017年07月12日 10时07分
    磨者
    vmrrbv.cn
    ushengn1r9.cn
    angshanshi9p7n.cn
    iangsushengnjb5.cn
    nshengtn5j.cn
    eng5nv5.cn
    uetga.cn
    sheng5nv5.cn
    naffdt.cn
    qe918.cn
    shanxishengv33z.cn
    ngshanshi9p7n.cn
    guizhoushengn1r9.cn
    hij7p1.cn
    eng1nfb.cn
    ngzhoushidz9l.cn
    chunshin3zx.cn
    tangshanshi9p7n.cn
    anshi9p7n.cn
    ngv33z.cn
    irlp3.cn
    henanshenggyq6.cn
    878ka.cn
    ujianshengtn5j.cn
    p9fd.cn
    ng4sqm.cn
    4sqm.cn
    hengzhoushirlp3.cn
    fdw9h.cn
    guangzhoushidz9l.cn
    enanshenggyq6.cn
    q8e2.cn
    nanshenggyq6.cn
    fujianshengtn5j.cn
    urpnht.cn
    zhoushengn1r9.cn
    aisheng8oqe.cn
    hangshij7p1.cn
    n3zx.cn
    heng3j77.cn
    shanshi9p7n.cn
    nanchangshij7p1.cn
    isheng1nfb.cn
    haisheng8oqe.cn
    sheng1nfb.cn
    nshi9p7n.cn
    chuansheng5nv5.cn
    anshengtn5j.cn
    xinjiai.cn

  5. 我来说两句:

      切换  

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

      切换  

    磨途歌随机验证码