http server
通过传递参数平滑启动服务
服务应该在另外一个文件中,在服务被workerstart是引入,
function server()
{
$server = new Swoole\Http\Server("127.0.0.1", 9502);
//测试在 $server 外部注册全局自定义属性, 看看会不会被覆盖
$server->myWorkerVar = 'global';
$server->set(array(
'worker_num' => 1,//测试定义多个worker时查看
'daemonize' => false,
));
//服务器启动时执行一次
$server->on('Start', function (\Swoole\Http\Server $server) {
echo PHP_EOL . PHP_EOL . 'Start:' . PHP_EOL . PHP_EOL;
var_dump($server->myWorkerVar); //未被覆盖,可以声明
});
//服务器启动时执行一次
$server->on('ManagerStart', function (\Swoole\Http\Server $server) {
echo 'ManagerStart: ' . PHP_EOL . PHP_EOL;
});
//每个 Worker 进程启动或重启时都会执行
$server->on('WorkerStart', function (\Swoole\Http\Server $server, int$workerId) {
//通过重新加载外部文件来重载代码和释放之前占用的内存
include_once __DIR__ . DIRECTORY_SEPARATOR .'reload_page.php';
//下面这些直接写在当前文件中的代码即便重载也不会变化
echo 'WorkerStart: ' . PHP_EOL . PHP_EOL;
echo ' Worker ID: ' . $workerId. PHP_EOL . PHP_EOL;
//启动服务器后, 去掉下面这行注释, 然后 reload , 该语句也不会执行的
echo ' reloaded ! ' .PHP_EOL . PHP_EOL;
//应该把这里的回调事件代码写在另一个文件中来 include 而不是直接写在这里
//注意即便是 include_once , reload 也会重新加载的, 但在你的逻辑控制中是有效的
});
//每次连接时(相当于每个浏览器第一次打开页面时)执行一次, reload 时连接不会断开, 也就不会再次触发该事件
$server->on('Connect', function (\Swoole\Http\Server $server, int$fd, int $reactorThreadId) {
echo 'Connect: ' . PHP_EOL . PHP_EOL;
echo ' Worker ID: '.$server->worker_id . PHP_EOL . PHP_EOL;
echo ' fd: ' . $fd . ' ,fromId: ' . $reactorThreadId . PHP_EOL . PHP_EOL;
});
//浏览器连接服务器后, 页面上的每个请求均会执行一次,
//每次打开链接页面默认都是接收两个请求, 一个是正常的数据请求, 一个 favicon.ico 的请求
$server->on('Request', function (\Swoole\Http\Request $request,\Swoole\Http\Response $response) use ($server) {
//通过加载文件的方式来重载代码, 如果是 include_once 则只有第一次请求会加载, 其中的代码也只有第一次请求才会执行
include_once __DIR__ . DIRECTORY_SEPARATOR.'reload_page.php';
if ($request->server['request_uri'] == '/favicon.ico') {
$response->end();
return;
}
echo 'Request: ' . PHP_EOL . PHP_EOL;
echo ' Worker ID: '.$server->worker_id . PHP_EOL . PHP_EOL;
echo ' URL: ' .($request->server['request_uri'] ?? '') . PHP_EOL . PHP_EOL;
//通过链接参数热重载 worker 进程观察触发事件
$act = $request->get['act'] ?? '';
if ($act == 'reload') {
echo ' ... Swoole Reloading !... ' . PHP_EOL . PHP_EOL;
//触发 reload 之后, 貌似后面的代码也还是会执行的
$server->reload();
// 看看 reload 时是否会执行后续的代码
echo ' ... Under Reload ! ... '. PHP_EOL . PHP_EOL;
} elseif ($act == 'exit') {
//直接立即终止当前 worker 进程, 和 reload 的效果比较相似, 新的worker 进程的 ID 和原来的一样
//所以程序内部应该尽量避免使用 exit 而应该抛出异常在外部catch
echo ' ... Swoole Exit ! ... '. PHP_EOL . PHP_EOL;
exit;
} elseif ($act == 'shutdown') {
//直接立即终止当前 worker 进程, 和 reload 的效果比较相似, 新的worker 进程的 ID 和原来的一样
//所以程序内部应该尽量避免使用 exit 而应该抛出异常在外部catch
echo ' ... Swoole Shutdown !... ' . PHP_EOL . PHP_EOL;
$server->shutdown();
echo ' ... After SwooleShutdown ! ... ' . PHP_EOL . PHP_EOL;
}
$response->header("X-Server", "Swoole");
$msg = 'hello swoole !';
$response->end($msg);
});
$server->start();
}
server();
定义全局变量验证
服务器启动时执行验证
先理解下启动顺序
服务启动
Start --->onStart--->ManageStart--->onWorkerStart
事件发生
onConnect--->onReceive--->onClose
reload参数验证
Shutdown 参数验证
Exit参数验证
更新业务验证
Reload_page.php中的内容部分更新为:
Reload服务: