我需要PHP中的并行任务运行器(最有可能在Windows - IIS7 fastcgi上),它有一个完整的实现隐藏。它的界面应该是这样的:
$taskRunner = new ParallelTaskRunner();
$taskRunner->add(function () use ($sharedResource){
//task 1
});
$taskRunner->add(function () use ($sharedResource){
//task 2
});
$taskRunner->run(); //runs task 1, task 2 parallel
我做了一些研究:我知道我可以并行运行PHP代码的技术 - pthreads,pcntl,exec,gearman,curl multi等......
我需要回答的问题:
- 是否可以使用这些技术中的任何一种隐藏此实现?如何做到这一点(如果实现细节中有一些高级解决方法)?有没有具有此功能的库?
- 如何提取并行任务运行的信息?例如:
task1: { a(); b(); }
,task2: { c(); }
,我怎么知道函数的调用顺序是a(); b(); c();
的还是a(); c(); b();
的,还是c(); a(); b();
的? - 如果出现问题,如何调试我的任务?
更新
我检查了许多可能的解决方案,最终得到了 pthreads。使用线程比使用进程容易得多...唯一的缺点是它不支持xdebug。
PHP 中带有 pthreads 的承诺
我写的东西,但没有时间谈论...
承诺是美味的,它们使通常相当复杂的东西变成非常简单的东西。
当我们谈论Javascript时,每个人都理解堆栈的概念;这就是动画以及我们在网络上做的许多其他花哨的东西是如何运行的。
实际上,我为 pthreads 编写承诺的努力是试图让线程像 Javascript 堆栈一样简单,每个人都能理解。
碰巧的是,这个东西几乎完全适合您的需求:
$manager = new PromiseManager();
$promise =
new Promise($manager, new CalculateTheMeaningOfLife());
$promise
->then(
new AddTwo($promise))
->then(
new PrintMeaning($promise));
$manager->shutdown();
你必须使用对象而不是闭包(Zend的限制),但它是承诺模式,它是完全异步和托管的。
这是PHP,所以可以与作曲家一起安装...如果你喜欢那种东西...
https://github.com/krakjoe/promises