sel/d/ / signal-handler
简单的Unix信号处理器,在不支持信号的平台中静默失败,便于跨平台开发
Requires
- php: >=7.2.0
Requires (Dev)
- phpstan/phpstan: ^1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1
- phpstan/phpstan-strict-rules: ^1.3
- phpunit/phpunit: ^7.5.20 || ^8.5.23
- psr/log: ^1 || ^2 || ^3
This package is auto-updated.
Last update: 2024-08-23 08:24:35 UTC
README
一个简单的跨平台1信号处理器。
1 Windows支持仅限于PHP 7.4+,并且仅支持捕获SIGINT
/SIGBREAK
(分别对应ctrl+c
和ctrl+break
)。在较老的PHP版本中,它在Windows上会静默失败,因此你可以使用它,但信号会像库未使用一样中断PHP。
使用方法
注意:为了最大化跨平台支持,所有信号都作为常量在SignalHandler类中可用,建议使用这些常量而不是PHP常量,因为不是所有平台都提供了这些常量。
默认使用方法,监听SIGTERM和SIGINT(即Ctrl+C / ^C中断)
use Seld\Signal\SignalHandler; $signal = SignalHandler::create(); while (true) { // do some work here ... // exit gracefully at the end of an iteration if the process interruption was called for if ($signal->isTriggered()) { $signal->exitWithLastSignal(); } }
嵌套/堆叠和注销信号处理器
如果你创建了多个SignalHandler
实例,它们将被保存在一个堆栈上,并且只有最顶层/最后创建的实例在接收到信号时会被触发。
当你注销最顶层的一个时,之前的一个又会变得活跃,等等。
但是,为了使它很好地工作,你需要确保在完成使用信号处理器后正确地注销它。在PHP 8.0+中,这会在信号处理器被垃圾回收时自动完成,因为堆栈使用WeakReference实例来跟踪处理器。然而,在PHP 7中,你需要显式地调用$signal->unregister();
来将其从全局处理器堆栈中移除。
如果你需要PHP 7支持,它可能看起来像这样
use Seld\Signal\SignalHandler; $signal = SignalHandler::create(); try { // do things } finally { $signal->unregister(); }
监听自定义信号并将处理器重置以多次处理同一信号
use Seld\Signal\SignalHandler; // using strings for the constant names makes sure the code will run on Windows and // OSX even if the signal is missing on those platforms $signal = SignalHandler::create([SignalHandler::SIGHUP, SignalHandler::SIGUSR1]); while (true) { // do some work here ... // reload the config when the signal was triggered if ($signal->isTriggered()) { $this->reloadConfiguration(); // reset the handler so next time you check isTriggered() it // will be false, until SIGHUP/SIGUSR1 is signaled again $signal->reset(); } }
传递一个PSR-3 Logger,它会记录->info('Received '.$signalName)
use Seld\Signal\SignalHandler; $signal = SignalHandler::create(null, new PSR3Logger());
传递一个回调函数,你可以对信号做出反应
use Seld\Signal\SignalHandler; $signal = SignalHandler::create([SignalHandler::SIGINT], function (string $signalName, SignalHandler $self) { echo 'Received ' . $signalName . PHP_EOL; // you can optionally receive the SignalHandler instance as second arg to do things on it like // resetting its state or exiting to handle the signal $self->reset(); $self->exitWithLastSignal(); });
警告:如上所述,在PHP 8.0+中,此库使用弱引用来跟踪处理器,因此如果你不将
::create()
的结果存储在一个变量中,该变量在你需要处理器的时间范围内保持不变,它将不会工作,并且你的回调函数将永远不会被调用。
安装
要使用Composer快速安装,请使用
$ composer require seld/signal-handler
要求
- PHP 7.2+(或PHP 5.4+的v1版本,现在已经停止维护)
提交错误和功能请求
错误和功能请求在GitHub上跟踪
作者
Jordi Boggiano - j.boggiano@seld.be - http://twitter.com/seldaek
许可证
signal-handler遵循MIT许可证 - 有关详细信息,请参阅LICENSE文件