欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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

程序员文章站 2024-02-05 12:09:16
...
workerman定时检测&平滑重启机制
一、定时检测

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

参考地址: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的配置项:
$worker->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定时检测&平滑重启机制

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

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

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