kore/njq

原生PHP作业队列

dev-master 2023-02-17 09:42 UTC

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扩展。