workerman定时检测&平滑重启机制
一、定时检测

上次聊了下workerman与Thinkphp是如何结合使用,经过自己测试后已经部署到正式环境。如图
workerman与Thinkphp定时检测&平滑重启机制-LMLPHP

参考地址:http://www.isbala.com/article/269.html
Thinkphp: http://www.thinkphp.cn/code/2026.html

好了,这里workerman我使用守护进程方式运行的,如果守护进程的主进程挂了,咱们业务就会受到影响了,比如统计数据缺失等
这次我们使用定时从检测来防止主进程挂掉,这里我们在Linux环境,利用crontab服务:

定时以root运行,编辑 /var/spool/cron/root

*/1 * * * * /bin/sh /data/yunwei/XXXXX/workermanMonitor.sh > /dev/null 2>&1 &

此处,每分钟进行检测主进程是否还在,不在的话,立即重启

workermanMonitor.sh脚本:

#!/bin/bash
# author: XXXX
# desc: 监控workerman主进程

count=`ps -ef |grep 'WorkerMan'| grep -v 'grep' | grep 'master' | wc -l`

echo $count

if [ $count -lt 1 ]; then
# 此处写入你的web项目根目录, thinkphp命令行需要在根目录运行
cd /data/wwwroot/XXXXX/
/usr/local/php/bin/php index.php Workerman/index restart
echo "restart";
echo $(date +%Y-%m-%d_%H:%M:%S) >/data/wwwlogs/CMSWorker/mainRestart.log
fi

二、平滑重启:

上次讲到的workerman在thinkphp控制器代码,我们已经部署到了正式,若我们需要增加各种配置项在Home/Conf/config.php中,由于workerman是以守护进程运行,
这个配置项在开启的时候是已经加载完成的,重启workerman会影响到正式业务,此时要用到workerman的平滑重启机制,当然并不是真正重启了workerman。
我们在workerman代码中这样加载thinkphp的配置项:
onMessage = function($connection, $data){
static $request_count = 0;// 已经处理请求数
if(++$request_count >= MAX_REQUEST){// 如果请求数达到1000,退出当前进程,主进程会立刻重新启动一个全新进程补充上来,从而完成进程重启
Worker::stopAll();
}
C(load_config(MODULE_PATH.'Conf/config'.CONF_EXT));//重新载入配置, 注意此处加载大家自己的Thinkphp配置项,我自己的业务是其它配置。
.....//其它业务逻辑代码
}

在回调方法中重新加载Thinkphp配置,这样就不需要重启了,来回顾下workerman重启:
/usr/local/php/bin/php index.php Workerman/index restart

总结:
说到这里,可能有些人会想到定时的问题,每增加一个任务,难道都要上Linux编辑/var/spool/cron/root, 正式环境咱没权限咋搞? 还要麻烦运维同学去操作吗?
Thinkphp有没有办法做到可以在后台直接配置这些类似crontab服务,然后一键发布配置项,业务就按照我的配置去按时稳定执行呢?

有!先来上张图:

workerman与Thinkphp定时检测&平滑重启机制-LMLPHP

周一了,要上班了,代码神马的下次补上~

您也可以参考这里:http://www.isbala.com/article/271.html

AD:真正免费,域名+虚机+企业邮箱=0元

09-17 10:23