irap / queues
由于英国人喜欢排队,因此这个包用于排队。
Requires
- php: >=7.0.0
- irap/interfaces: 0.1.*
This package is auto-updated.
Last update: 2024-09-24 02:32:03 UTC
README
此包创建的目的是简化创建任务队列,例如用于发送异步MySQL查询或CURL请求。
需求
- 此包使用PHP 5.6构建/测试。它可能在较早的版本上工作也可能不工作,但请注意,任何低于5.6的PHP版本都是过时的。
队列
SerialRunnableQueue
按顺序逐个运行项目(FIFO),等待每个项目完成后再运行下一个。
ParallelRunnableQueue
并行运行项目。这些项目可以以任何顺序执行/完成。这是实现性能优势的地方。
RunnableStack
以与SerialRunnableQueue
相同的方式执行项目,但与FIFO不同,项目以相反的顺序执行,最后添加的项目首先执行。
接口
为了使用队列,放入队列的对象需要实现RunnableInterface
接口,这意味着对象有一个返回true时任务已完成的run
方法。此方法将在队列调用直到返回true。这看起来很愚蠢,但对于可能需要一些时间才能完成的异步请求是必要的,因此您需要跟踪对象中的状态并在结果返回时返回true。
队列中的队列
由于所有队列都实现了RunnableInterface
,因此可以创建其他队列的队列,以创建所需的任何组合。例如,您可能有一些“任务”,这些任务必须按一定顺序执行,但是每个“任务”可能包含数百个可以以任何顺序执行的“子任务”。在这种情况下,您可能希望创建一个ParallelRunnableQueue
来放置每个子任务组。然后,您将这些并行队列放入单个SerialRunnableQueue
对象中,以确保组按正确顺序执行。
每个队列在其构造函数中可以接受一个可选的回调。此回调在队列完成/清空时执行,允许开发者在队列完成后运行逻辑。
队列的大小不是固定的,您可以使用add
方法在需要时向它们添加,包括在它们运行时。但是,请记住,每次队列耗尽时都会调用队列的回调。
示例用法
...
$asyncQuery1 = new \iRAP\AsyncQuery\AsyncQuery(
$sql1,
$queryCallback1,
$connectionPool
);
$asyncQuery2 = new \iRAP\AsyncQuery\AsyncQuery(
$sql2,
$queryCallback2,
$connectionPool2 # <-- different pool, perhaps for a different database?
);
$parallelRunnableQueue = new \iRAP\Queues\ParallelRunnableQueue($queueCallback);
$parallelRunnableQueue->add($asyncQuery1);
$parallelRunnableQueue->add($asyncQuery2);
# Run until the queue has completed all of the tasks.
while ($parallelRunnableQueue->run() !== TRUE)
{
usleep(1);
}
自动测试
只需转到testing
目录并执行main.php
脚本。所有添加新功能的相关代码贡献都应该提供相关的测试用例。阅读自动化测试以获取示例用法可能是个好主意。