snailweb / php-daemon
此包最新版本(2.0.0)没有提供许可证信息。
PHP守护进程
2.0.0
2019-03-08 17:42 UTC
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- phpunit/phpunit: ^8.0
- snailweb/php-tests-helpers: ^1.0
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();