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分
      <!DOCTYPE html>
<!--[if lt IE 7 ]><html class= 404 — 磨延城的博客 - 专注技术研究,分享生活体验

      步途坎坷,磨者独行,悠悠长歌觅知音.

      404: 好像迷路了...

      很抱歉,您要访问的页面迷路了,找不到了。您可以使用下边的搜索框进行搜索,也可以浏览你感兴趣的热门标签。