大家好,又见面了,我是全栈君。
守护进程
swoole官方也为我们提供了配置选项daemonize(默认未启用),若要开启守护进程,daemonize设置为true即可,这样就可以不受终端控制,在后台运行。
配置为守护进程后,所有的标准输出将失效,如果要调试,可以配置log_file,所有的标准输出统统记载到该文件中。
平滑重启
swoole是常驻内存的,若想让修改后的代码生效,就必须Ctrl+C,然后再重启server。对于守护进程化的server呢?则需kill掉后,再重启。
事实上,swoole进程刚好处理了一半的数据,此时被kill,就特别容易出现问题。
swoole为我们提供了平滑重启机制,我们只需要向swoole_server的主进程发送特定的信号,即可完成对server的重启。
平滑重启包含的信号
-
SIGTERM,一种优雅的终止信号,会待进程执行完当前程序之后中断,而不是直接干掉进程
-
SIGUSR1,将平稳的重启所有的Worker进程
-
SIGUSR2,将平稳的重启所有的Task进程
pstree | grep server_process #找出主进程
kill -TERM 55559 #优雅终止主进程
kill -USR1 55559 #热重启worker进程,onWorkerStart回调之后加载的文件,重启才有意义
kill -USR2 55559 #热重启task进程,onTask回调之后加载的文件,重启才有意义
要加载的文件 (Person.php)
~~~
class Person
{
public $name = '';
public function __toString(){
return "~~___".$this->name."___";
}
}
~~~
server 热重启代码
~~~
$serv = new swoole_server('127.0.0.1', 9501);
// 配置为守护进程方式,以及log调试日志
$serv->set([
'worker_num' => 1,
'daemonize' => true,
'log_file' => __DIR__ . '/server.log',
]);
$serv->on('Connect', function ($serv, $fd) {
echo "new client connected." . PHP_EOL;
});
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
echo "worker received data: {$data} from ". PHP_EOL;
});
$serv->on('WorkerStart', function ($serv, $workerId) {
//onWorkerStart之后加载的文件,如果该文件有改动,则可以热重启
require_once ('Person.php');
$p = new Person();
$p->name = 'wangkun';
echo $p;
});
$serv->start();
~~~
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111877.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...