kore / njq
dev-master
2023-02-17 09:42 UTC
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-09-17 14:58:45 UTC
README
为了利用多核处理器进行一些相对较长的处理操作,我最近需要一种方法,可以从单个PHP脚本中多次派生多个工作者。因此,我创建了这个小型项目,以实现这一功能,使其可由任何人重用。
原生作业队列
实现和使用相当简单。存在一个名为 JobProvider
的接口,该接口具有 hasJobs()
和 getNextJob()
方法,您需要实现这些方法。第二个方法应返回有效的PHP回调 - 例如闭包。然后由执行器并行执行这些回调。
我还实现了一个 ShellJobProvider
(实现了 JobProvider
),它从一个shell命令数组构建,然后并行执行这些命令。一个简单的示例
<?php require 'njq/environment.php'; $executor = new \njq\Executor(); $executor->run( new \njq\ShellJobProvider( array( 'echo 1 >> test', 'echo 2 >> test', 'echo 3 >> test', 'echo 4 >> test', 'echo 5 >> test', ) ), 4 ); ?>
文件 test
将包含类似的内容(顺序可能不同)
5 4 3 2 1
4
(\njq\Executor::run
的第二个参数)定义了要产生的并行进程数。在大多数情况下,这不应超过可用的核心数。
记录器
要查看执行器的状态,您可以指定一个记录器,然后它会打印当前的进度。记录器需要实现 \njq\Logger
接口,并传递给执行器的构造函数。如果没有指定记录器,将使用盲目的哑记录器。要使用shell记录器,将状态输出到STDERR,请使用
<?php require 'njq/environment.php'; $executor = new \njq\Executor( new \njq\ShellLogger() ); $executor->run( new \njq\ShellJobProvider( array( // ... ) ), 4 );
它将打印如下状态,如果 JobProvider
实现了 Countable
接口
56 / 5880 (0.95%) |
如果 JobProvider
没有实现 Countable
接口,则百分比指示器显然无法显示。
要求
作业队列需要PHP 5.3和PHP PCNTL扩展。