ryancco / forker
通过进程分叉进行异步处理
1.0.4
2019-04-26 19:47 UTC
Requires
- php: >=5.6.0
README
通过进程分叉在PHP中进行异步处理
示例
以下是一个荒诞的示例,创建并异步处理5个分叉的“子”进程之间的工作,总运行时间为300秒,如指定。如果一个“子”进程死亡、失败或在指定时间之前完成,将立即启动一个新的“子”进程来替代。您可以运行此示例,同时观察终端输出,并杀死和允许“子”进程完成其工作。
<?php require_once 'vendor/autoload.php'; use ryancco\forker\JobInterface; use ryancco\forker\WorkerDaemon; declare(ticks=1); // PHP <= 5.6.* class TestJob implements JobInterface { /** @var array $loopsCounted */ private $loopsCounted = array(); /** * Entry point for each child worker */ public function __invoke() { echo "New child spawned! [PID " . getmypid() . "]\n"; $this->countTo(5); } public function countTo($max = 5) { for ($i = 1; $i <= $max; $i++) { echo $this->formatOutput($i); sleep(10); } $this->loopsCounted[$max] += 1; } private function formatOutput($loops) { return "Pass #" . $loops . " [PID " . getmypid() . "]\n"; } private function recordLoopsCounted() { try { $queue = new Queue(); // Does not exist } catch (Exception $e) { exit("Unable to instantiate new Queue: " . $e->getMessage()); } $queue->push($this->loopsCounted); } /** * Exit point for each child worker * Make all of your garbage collection and stats recording calls here */ public function __destruct() { echo "__destruct() [PID " . getmypid() . "]\n"; $this->recordLoopsCounted(); } } $wd = new WorkerDaemon(5, 300); $wd->executeJob(new TestJob());
许可证
此库是开源软件,采用MIT许可证授权