piotrek-r / worker
一个简单的工人实现,循环回调函数直到满足定义的条件之一
0.1.3
2023-06-16 22:16 UTC
Requires
- php: ^8.1
Requires (Dev)
- phpunit/phpunit: ^10.0
README
一个简单的工人实现,循环回调函数直到满足定义的条件之一
安装
composer require piotrek-r/worker
使用
基本使用
$worker = new \PiotrekR\Worker\Worker(); $worker->run(function () { // do something });
回调函数应在执行了一些工作后返回一个真值,否则返回一个假值。这用于确定停止条件和休眠时间。
条件
可以使用 WorkerConditions
为工人设置停止条件。
条件:时间限制
您可以设置秒为单位的时间限制。
$workerConditions = new \PiotrekR\Worker\WorkerConditions( timeSeconds: 10, ); $worker = new \PiotrekR\Worker\Worker($workerConditions); $worker->run(function () { // do something });
条件:内存限制
您可以设置字节数为整数的内存限制,也可以设置为带有单位后缀的字符串。支持的单位有:b
、k
、m
、g
、t
、p
、e
、z
、y
。它使用 memory_get_usage(true)
来确定当前内存使用。
$workerConditions = new \PiotrekR\Worker\WorkerConditions( memoryLimit: '512m', ); $worker = new \PiotrekR\Worker\Worker($workerConditions); $worker->run(function () { // do something });
条件:循环限制
您可以设置循环限制。达到给定次数的循环后,将停止工人。
循环限制有三种不同类型
countLoops
- 其他类型的总和countHandled
- 函数返回真值的循环次数countEmpty
- 函数返回假值的循环次数
仅进行100次循环,无论结果如何
$workerConditions = new \PiotrekR\Worker\WorkerConditions( countLoops: 100, );
当函数返回 true
时仅运行5次,当函数返回 false
时无限循环
$workerConditions = new \PiotrekR\Worker\WorkerConditions( countHandled: 5, );
无限循环,并在函数第一次返回 false
时停止(例如,在清空队列时,它将一直运行直到队列为空)
$workerConditions = new \PiotrekR\Worker\WorkerConditions( countEmpty: 1, );
配置
休眠时间
您可以设置微秒为单位的休眠时间。每次循环后,它会休眠。您可以为循环后有真值和假值的情况设置不同的休眠时间。
$workerConfiguration = new \PiotrekR\Worker\WorkerConfiguration( sleepMicrosecondsAfterHandled: 1000, // 1ms to get quick to the next item sleepMicrosecondsAfterEmpty: 5000000, // 5s to not spam the queue ); $worker = new \PiotrekR\Worker\Worker(null, $workerConfiguration); $worker->run(function () { // do something });
参数
您可以将参数传递给 run
方法。所有参数都将传递给回调函数。
$arg1 = 'foo'; $arg2 = 'bar'; $arg3 = 3; $worker = new \PiotrekR\Worker\Worker(); $worker->run(function (string $arg1, string $arg2, int $arg3) { echo $argument; return true; }, $arg1, $arg2, $arg3);
结果
run
方法返回一个包含以下方法的 WorkerResult
对象
getTimeElapsed(): int
- 已经过去的时间(以秒为单位)getCountLoops(): int
- 其他类型的总和getCountHandled(): int
- 函数返回真值的循环次数getCountEmpty(): int
- 函数返回假值的循环次数
示例
use PiotrekR\Worker\Worker; use PiotrekR\Worker\WorkerConditions; use PiotrekR\Worker\WorkerConfiguration; $queue = new ThirdPartyQueueHandler(); $workerConditions = new WorkerConditions( timeSeconds: 10, memory: '512m', ); $workerConfiguration = new WorkerConfiguration( sleepMicrosecondsAfterHandled: 1000, sleepMicrosecondsAfterEmpty: 1000000, ); $worker = new Worker($workerConditions, $workerConfiguration); $result = $worker->run(function (ThirdPartyQueueHandler $queue) { return $queue->handleNextMessage(); }, $queue); printf( "It took %d seconds to loop %d times. Of which %d were handled, and %d were empty.\n", $result->getTimeElapsed(), $result->getCountLoops(), $result->getCountHandled(), $result->getCountEmpty(), );