swoole reload 平滑重启小实践

3 篇文章 0 订阅

官方参考: https://wiki.swoole.com/#/server/methods?id=reload

reload() 安全地重启所有 Worker/Task 进程。

Swoole\Server->reload(bool $only_reload_taskworkrer = false): bool
  • 平滑重启只对 onWorkerStartonReceive 等在 Worker 进程中 include/require 的 PHP 文件有效
  • Server 启动前就已经 include/require 的 PHP 文件,不能通过平滑重启重新加载
  • 对于 Server 的配置即 $serv->set() 中传入的参数设置,必须关闭 / 重启整个 Server 才可以重新加载
  • Server 可以监听一个内网端口,然后可以接收远程的控制命令,去重启所有 Worker 进程

平滑重启可调用 reload() 方法 或者 执行 kill -USR1 主进程PID 命令来重启所有worker进程

测试代码:

reload_test.php

$server = new Swoole\Http\Server("0.0.0.0", 9501);

$server->set(array(
    'worker_num' => 2,
));

// 服务器启动时执行一次
$server->on('Start', function ($server) {
    echo 'Start' . PHP_EOL;
});

// 服务器启动时执行一次
$server->on('ManagerStart', function ($server) {
    echo 'ManagerStart' . PHP_EOL;
});

// 每个 Worker 进程启动或重启时都会执行
$server->on('WorkerStart', function ($server, $workerId) {
    echo 'WorkerStart - Worker ID: ' . $workerId . PHP_EOL;
    // 测试reload
    include __DIR__ . DIRECTORY_SEPARATOR . 'workerstart.php';
});

$server->on('Connect', function ($server, $fd, $reactorId) {
    echo 'Connect - Worker ID: '. $server->worker_id . ' , fd: ' . $fd . ' , reactorId: ' . $reactorId. PHP_EOL;
});

$server->on('Request', function ($request, $response) use ($server) {

    if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
        $response->end();
        return;
    }

    echo 'Request - Worker ID: '. $server->worker_id . PHP_EOL;
    // 测试reload
    $test = new test();
    echo $test->str ?? 'not include file';

    $act = $request->get['act'] ?? '';
    if ($act == 'reload') {
        echo 'Swoole Reload ...' . PHP_EOL;
        $server->reload();
        echo 'Reload Success' . PHP_EOL;
    }

    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("Hello Swoole");
});

$server->start();

workerstart.php

class test
{
    public $str = 'include file: workstart.php' . PHP_EOL;
}

启动服务
php reload_test.php

Start
ManagerStart
WorkerStart - Worker ID: 0
WorkerStart - Worker ID: 1
include file: workstart
include file: workstart

可以看到输出两行 include file: workstart, 因为worker_num设置为2, 有2个worker进程
此时打开浏览器, 访问 http://127.0.0.1:9501

Connect - Worker ID: 0 , fd: 1 , reactorId: 0
Request - Worker ID: 0
include file: workstart.php

然后修改 workerstart.php 文件中变量 $strinclude file: test.php, 再次访问 http://127.0.0.1:9501
依旧输出 include file: workstart.php

Connect - Worker ID: 0 , fd: 2 , reactorId: 0
Request - Worker ID: 0
include file: workstart.php

访问 http://127.0.0.1:9501?act=reload 触发代码 $server->reload() 或者 执行命令 kill -USR1 主进程PID, 让程序重新 include 文件达到平滑重启的效果

Swoole Reload ...
[2020-05-12 20:56:41 $131.0]    INFO    Server is reloading all workers now
Reload Success
WorkerStart - Worker ID: 0
WorkerStart - Worker ID: 1

再次访问 http://127.0.0.1:9501, 看到更新成功, 输出 include file: test.php

Connect - Worker ID: 0 , fd: 4 , reactorId: 0
Request - Worker ID: 0
include file: test.php





  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值