snailweb/php-daemon

此包最新版本(2.0.0)没有提供许可证信息。

PHP守护进程

2.0.0 2019-03-08 17:42 UTC

This package is auto-updated.

Last update: 2024-09-12 05:31:39 UTC


README

PHP守护进程,可以拦截信号以停止正常运行。

安装

composer require snailweb/php-daemon

推荐

由于内存泄漏,PHP不是运行进程的安全方式,为了避免这种情况,此守护进程将根据其生命期和内存使用自动停止。

这意味着您必须使用类似 Supervisor 的服务来真正永久运行此守护进程!

使用方法

创建处理器

创建一个处理器来完成您的任务

final class AdminNotifierProcessor implements \Snailweb\Daemon\Processor\ProcessorInterface
{
    private $dao;
    private $notifier;

    // Inject your dependencies
    public function __construct(DAO $dao, Notifier $notifier)
    {
        $this->dao = $dao;
        $this->notifier = $notifier;
    }

    // Initialize stuff
    public function setUp(): void
    {
        $this->dao->connect();
        $this->notifier->setEmail('admin@domain.com');
    }

    // CLear stuff
    public function tearDown(): void
    {
        $this->dao->disconnect();
        unset($this->dao, $this->notifier);
    }

    // Do your stuff
    public function process(): void
    {
        $results = $this->dao->query("SELECT id, message FROM notifications WHERE status='notify'");
        foreach ($results as $result) {
            $this->notifier->notify($result->message);
            $this->dao->query("UPDATE table SET status = 'notified' WHERE id = ?", $results->id);
        }
    }
}

基本守护进程使用方法

$processor = new AdminNotifierProcessor($dao, $notifier);

$daemon = new \Snailweb\Daemon\Daemon($processor);
$daemon->run();

默认情况下,守护进程的策略是永久运行,但您可以根据需要更改其行为。

其他守护进程使用方法

运行守护进程5个进程迭代

$strategy = new Snailweb\Daemon\Strategy\Iteration(5);
$daemon->run($strategy);

运行守护进程1分钟

$strategy = new Snailweb\Daemon\Strategy\Timer(60);
$daemon->run($strategy);

您可以通过扩展 \Snailweb\Daemon\Strategy\AbstractStrategy 来轻松创建自己的策略

配置守护进程

默认守护进程配置可以被覆盖

$daemon->setOptions([
    'run_ttl' => 86400, // the daemon will stop after 1 day of runtime
    'run_memory_limit' => 128, // the daemon will stop when he reached 128MB of memory usage
    'process_min_exec_time' => 100, // The minimum time between 2 process execution (to avoid CPU overload when your process has nothing do)
]);

注意:您不需要设置所有选项,只需设置您想要覆盖的选项即可 :)

处理信号

此守护进程允许您处理 UNIX信号 以更改其行为。

创建您的信号处理器

final class MySignalHandler extends \Snailweb\Daemon\Signals\Handler\AbstractSignalsHandler
{
    public function handle(int $signal, Snailweb\Daemon\Daemon $daemon): void
    {
        switch ($signal) {
            case SIGINT:

                // Change daemon's behaviour

                // Apply an other processor
                $daemon->setProcessor(new ProperExitProcessor());
                // For only 10 more iterations
                $daemon->setStrategy(new \Snailweb\Daemon\Strategy\Iteration(10));

                break;
            case SIGTERM:

                // Instantly stop our script
                $daemon->stop();

                break;
        }
    }
}

将信号处理器应用于您的守护进程

$processor = new AdminNotifierProcessor();

$signals = new \Snailweb\Daemon\Signals\Signals([SIGINT, SIGTERM]);
$signalsListener = new \Snailweb\Daemon\Signals\Listener\SignalsListener();
$signalsHandler = new MySignalHandler();
$signalsManager = new \Snailweb\Daemon\Signals\Manager\SignalsManager($signals, $signalsListener, $signalsHandler);

$daemon = new \Snailweb\Daemon\Daemon($processor, $signalsManager);
$daemon->run();