- 前言
- 版本管理
- 快速入门
- 核心架构
- 基础功能
- 数据库模型
- 微服务
- 网络服务
- 消息队列
- 客户端
- 其它组件
- 应用部署
- Awesome Hyperf
- 组件开发指南
- 版本升级指南
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
信号处理器
信号处理器会监听 Worker
进程和 自定义
进程启动后,自动注册到信号管理器中。
安装
composer require hyperf/signal
发布配置
您可以通过下面的命令来发布默认的配置文件到您的项目中:
php bin/hyperf.php vendor:publish hyperf/signal
添加处理器
以下我们监听 Worker
进程的 SIGTERM
信号,当收到信号后,打印出信号值。
<?php
declare(strict_types=1);
namespace App\Signal;
use Hyperf\Signal\Annotation\Signal;
use Hyperf\Signal\SignalHandlerInterface;
/**
* @Signal
*/
class TermSignalHandler implements SignalHandlerInterface
{
public function listen(): array
{
return [
[SignalHandlerInterface::WORKER, SIGTERM],
];
}
public function handle(int $signal): void
{
var_dump($signal);
}
}
因为 Worker 进程接收的 SIGTERM 信号被捕获后,无法正常退出,所以用户可以直接 Ctrl + C
退出,或者修改 config/autoload/signal.php
配置,如下:
WorkerStopHandler 不适配于 CoroutineServer,如有需要请自行实现
<?php
declare(strict_types=1);
return [
'handlers' => [
Hyperf\Signal\Handler\WorkerStopHandler::class => PHP_INT_MIN
],
'timeout' => 5.0,
];
WorkerStopHandler
触发后,会在所设置的 max_wait_time 配置时间后,关闭掉当前进程。
协程风格服务监听器配置示例
以上默认的监听器都是适配于异步风格服务的,如果需要在协程风格服务下使用,可以按照以下自定义配置
<?php
declare(strict_types=1);
namespace App\Kernel\Signal;
use Hyperf\AsyncQueue\Driver\Driver;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Process\ProcessManager;
use Hyperf\Server\ServerManager;
use Hyperf\Signal\SignalHandlerInterface;
use Psr\Container\ContainerInterface;
class CoroutineServerStopHandler implements SignalHandlerInterface
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* @var ConfigInterface
*/
protected $config;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
$this->config = $container->get(ConfigInterface::class);
}
public function listen(): array
{
// 协程风格只会存在一个 Worker 进程,故这里只需要监听 WORKER 即可
return [
[self::WORKER, SIGTERM],
[self::WORKER, SIGINT],
];
}
public function handle(int $signal): void
{
ProcessManager::setRunning(false);
foreach (ServerManager::list() as [$type, $server]) {
// 循环关闭开启的服务
$server->shutdown();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论