sel/d//signal-handler

简单的Unix信号处理器,在不支持信号的平台中静默失败,便于跨平台开发

2.0.2 2023-09-03 09:24 UTC

README

一个简单的跨平台1信号处理器。

1 Windows支持仅限于PHP 7.4+,并且仅支持捕获SIGINT/SIGBREAK(分别对应ctrl+cctrl+break)。在较老的PHP版本中,它在Windows上会静默失败,因此你可以使用它,但信号会像库未使用一样中断PHP。

Continuous Integration

使用方法

注意:为了最大化跨平台支持,所有信号都作为常量在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文件