temkaa / signal
一个简单的用于订阅PHP信号的库
v0.0.2
2024-09-25 16:02 UTC
Requires
- php: ^8.3
Requires (Dev)
- ext-posix: *
- phpmd/phpmd: ^2.15
- phpunit/phpunit: ^10.5
- vimeo/psalm: ^5.26
This package is auto-updated.
Last update: 2024-09-25 16:05:22 UTC
README
一个简单的信号订阅管理器实现。
安装
composer require temkaa/signal
此包自动检测您正在使用的操作系统,以进行测试和生产信心。对于Windows,它使用 sapi_windows_set_ctrl_handler
,对于Linux - pcntl_signal
。
包允许您指定特定PHP信号的订阅者。要使用此包,您需要
- 如果您使用Windows,您需要启用函数
and
; - 如果您使用任何其他操作系统,您需要启用
pcntl
扩展和函数pcntl_async_signals
、pcntl_signal
。
示例
<?php use Temkaa\Signal\SignalSubscriberInterface; use Temkaa\Signal\SignalManager; use const PHP_EOL; use const SIGTERM; final class SigtermListener implements SignalSubscriberInterface { private bool $isCalled = false; public function handle(): void { $this->isCalled = true; echo 'Got sigterm signal, closing database connection...'.PHP_EOL; } public function isCalled(): bool { return $this->isCalled; } } $sigtermListener = new SigtermListener(); $signalManager = new SignalManager(); $signalManager->subscribe($sigtermListener, SIGTERM); posix_kill(posix_getpid(), SIGTERM); // $sigtermListener->isCalled is true at this point assert($sigtermListener->isCalled() === true);
您还可以注销特定的监听器,检查是否有任何监听器已订阅特定信号等。
<?php use Temkaa\Signal\SignalSubscriberInterface; use Temkaa\Signal\SignalManager; use const PHP_EOL; use const SIGTERM; final class SigtermListener implements SignalSubscriberInterface { public function handle(): void { echo 'Got sigterm signal, closing database connection...'.PHP_EOL; } } $sigtermListener = new SigtermListener(); $signalManager = new SignalManager(); $signalManager->subscribe($sigtermListener, SIGTERM); assert($signalManager->hasSubscriber(SIGTERM) === true); assert($signalManager->getSubscriber(SIGTERM) === $sigtermListener); $signalManager->unsubscribe(SIGTERM); assert($signalManager->hasSubscriber(SIGTERM) === false);