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数据库,连接超时导致的程序崩溃。
上一篇:IE浏览器的一些兼容性问题
下一篇:创业公司的网站架构设计
我来说两句: