temkaa/

signal

一个简单的用于订阅PHP信号的库

v0.0.2 2024-09-25 16:02 UTC

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信号的订阅者。要使用此包,您需要

  1. 如果您使用Windows,您需要启用函数 and
  2. 如果您使用任何其他操作系统,您需要启用 pcntl 扩展和函数 pcntl_async_signalspcntl_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);