作者:浪漫的没天份 | 来源:互联网 | 2023-06-30 21:11
视频地址https:www.bilibili.comvideoBV14E411t7T4?p24&vd_source4a69745b599dffec877b0fcfe130b092注
视频地址 https://www.bilibili.com/video/BV14E411t7T4?p=24&vd_source=4a69745b599dffec877b0fcfe130b092
注意:开发时才使用热加载,实际上线时不使用
1 关于服务的平滑重启
1.1 代码
pro\core\server\HttpServer.php
php
namespace Core\Server;
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
class HttpServer
{
private $server;
/**
* HttpServer constructor.
*
* @param $server
*/
public function __construct()
{
$this->server = new \Swoole\Http\Server('0.0.0.0',80);
//配置参数 https://wiki.swoole.com/#/server/setting
$this->server->set(array(
'worker_num'=>1, //设置启动的 Worker 进程数。【默认值:CPU 核数】
'daemonize'=>false // 使用docker 不需要设置守护进程
));
//$this->server->on('request',function ($req,$res){});
$this->server->on('request',[$this,'onRequset']);
$this->server->on('Start',[$this,'onStart']);
$this->server->on('ShutDown',[$this,'onShutDown']);
$this->server->on('WorkerStart',[$this,'onWorkerStart']);
$this->server->on('ManagerStart',[$this,'onManagerStart']);
//$http->start();
}
public function onWorkerStart(Server $server,int $workerId)
{
require_once (__DIR__."./../../test3.php");
cli_set_process_title("ttt worker"); //设置进程名称
}
public function onRequset(Request $request,Response $response)
{
$response->end(showMe());
}
public function onStart(Server $server)
{
cli_set_process_title("ttt master"); //设置进程名称
$mid = $server->master_pid; //返回当前服务器主进程的 PID。
file_put_contents("./ttt.pid",$mid); //会覆盖
}
public function onManagerStart(Server $server)
{
cli_set_process_title("ttt manager"); //设置进程名称
}
public function onShutDown(Server $server)
{
echo '关闭了'.PHP_EOL;
unlink("./ttt.pid");
}
public function run()
{
$this->server->start();
}
}
View Code
pro\test3.php
php
function showMe()
{
return 'ttt2';
}
1.2 测试
docker exec -it 67e09c446436 sh
原先
ps -ef |grep php
现在
ps -ef |grep php
1.3 reload
SIGUSR1
: 向主进程 / 管理进程发送 SIGUSR1
信号,将平稳地 restart
所有 Worker
进程和 TaskWorker
进程
SIGUSR2
: 向主进程 / 管理进程发送 SIGUSR2
信号,将平稳地重启所有 Task
进程
kill -USR1 136
# 重启所有worker进程
kill -USR1 主进程PID
# 仅重启task进程
kill -USR2 主进程PID
参考手册 https://wiki.swoole.com/#/server/methods?id=reload
2 添加前置进程、修改代码服务器自动热更新
在我们的http server中加一个启动进程
Server->addProcess
https://wiki.swoole.com/wiki/page/390.html
添加一个用户自定义的工作进程。此函数通常用于创建一个特殊的工作进程,用于监控、上报或者其他特殊的任务。
bool Server->addProcess(Process $process);
2.1 代码
\pro\core\init\TestProcess.php
php
/**
* Created by PhpStorm.
* User: SUN
* Date: 2022/7/25
* Time: 3:48
*/
namespace Core\init;
use Swoole\Process;
class TestProcess
{
public function run()
{
$process = new Process(function() {
while (true) {
echo "ttt".PHP_EOL;
sleep(3);
}
});
return $process;
}
}
View Code
\pro\core\server\HttpServer.php
public function run()
{
$p = new TestProcess();
$this->server->addProcess($p->run());
$this->server->start();
}
2.2 测试