pbergman / fork
fork 库
2.0.2
2015-05-28 21:20 UTC
Requires
- php: >=5.4.0
- monolog/monolog: ~1.13
- opis/closure: 1.3.*
README
这是一个用于将工作调度到工作者(子进程)的小型包装器,它使用 opis/closure 来序列化闭包,并使用 redis(订阅/发布和列表方法)来分发工作。这与旧版本的工作方式略有不同,因为这一次将fork子进程并发送工作给它们,而不是为每个工作fork新的子进程。
###使用方法
require 'vendor/autoload.php';
$m = new \PBergman\Fork\Manager();
$m->setWorkers(10);
for ($i = 0; $i < 25; $i++) {
$foo = rand(1,8);
$m->addJob(function($redis, $logger) use ($foo) {
$logger->info('sleeping ' . $foo);
sleep($foo);
});
}
$m->run();
将输出类似的内容
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10665 [1/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10666 [2/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10667 [3/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10668 [4/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10669 [5/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10670 [6/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10671 [7/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10672 [8/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10673 [9/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10674 [10/10]
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10665
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10666
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10667
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10668
[2015-05-27 18:16:52] [10666] manager.INFO: sleeping 6
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10669
[2015-05-27 18:16:52] [10665] manager.INFO: sleeping 8
[2015-05-27 18:16:52] [10667] manager.INFO: sleeping 5
[2015-05-27 18:16:52] [10668] manager.INFO: sleeping 1
...........
[2015-05-27 18:17:07] [10663] manager.DEBUG: Child 10672 exited with code 0
[2015-05-27 18:17:07] [10671] manager.DEBUG: Job finished
[2015-05-27 18:17:07] [10671] manager.DEBUG: Cleaning up resources
[2015-05-27 18:17:07] [10663] manager.DEBUG: Pushing exit signal to ##MANAGER@10671
[2015-05-27 18:17:07] [10671] manager.DEBUG: Received exit signal, shutting down
[2015-05-27 18:17:09] [10674] manager.DEBUG: Job finished
[2015-05-27 18:17:09] [10674] manager.DEBUG: Cleaning up resources
[2015-05-27 18:17:09] [10663] manager.DEBUG: Pushing exit signal to ##MANAGER@10674
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10669 exited with code 0
[2015-05-27 18:17:09] [10674] manager.DEBUG: Received exit signal, shutting down
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10671 exited with code 0
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10674 exited with code 0
###方法
##__construct(<PBergman\Fork\Helper\Redis> $redis = null, <Psr\Log\LoggerInterface> $logger = null)
构造函数
##run()
将开始向子进程调度工作,直到所有工作完成为止,是阻塞的
##setWorkers( $workers)
设置要启动的工作者数量,如果有更多工作者,则将缩小到工作的大小
##setTimeoutIdle( $timeout_idle)
设置子进程空闲运行的时间超时(等待新工作)
##setGenerator(<PBergman\Fork\Generator\GeneratorInterface> $generator)
设置生成器,用于将数据转换为通过 redis 消息队列发送的数据
##addJob( $job)
向子进程添加工作,应该是可调用的,可以是闭包或实现了 __invoke() 的类