首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与ReactPhp并行运行代码

与ReactPhp并行运行代码
EN

Stack Overflow用户
提问于 2015-06-04 11:55:57
回答 1查看 2.1K关注 0票数 2

问题:我需要克隆/下载几个git存储库,不幸的是,这样做需要很长时间。我有想法使用ReactPhp事件循环并并行执行。

尽管做了很多尝试,但我无法让它并行运行。也许我误解了这个概念,但我期望ReactPhp以某种方式分叉执行我的代码。

你能看一看我的代码,并分享一些指导方针,如何使它工作?

代码语言:javascript
复制
use Symfony\Component\Stopwatch\Stopwatch;

include 'vendor/autoload.php';

$toClone = [
    ['url' => 'http://github.com/symfony/symfony.git', 'dest' => 'C:\tmp\cloneR1'],
    ['url' => 'http://github.com/laravel/laravel.git', 'dest' => 'C:\tmp\cloneR2'],
    ['url' => 'http://github.com/rails/rails.git', 'dest' => 'C:\tmp\cloneR3'],
];
$end = count($toClone);
$i = 0;

$deferred = new React\Promise\Deferred();
$fClone = function (\React\EventLoop\Timer\Timer $timer) use (&$i, $deferred, &$toClone, $end) {
    $project = array_pop($toClone);
    $git = new \GitWrapper\GitWrapper();
    $git->setTimeout(3600);
    $git->cloneRepository($project['url'], $project['dest']);
    $deferred->notify([$i++, $project['url']]);
    if ($end <= $i) {
        $timer->cancel();
        $deferred->resolve();
    }
};

$stopwatch = new Stopwatch();
$stopwatch->start('run');

$loop = React\EventLoop\Factory::create();
$loop->addPeriodicTimer(1, $fClone);

$deferred->promise()->then(function () use ($stopwatch) {
    echo 'DONE' . PHP_EOL;
    $event = $stopwatch->stop('run');
    echo 'Run took ' . $event->getDuration() / 1000 . 'sec and ' . $event->getMemory() . ' bytes of memory';
}, null, function ($data) {
    echo 'RUN ' . $data[0] . ' - ' . $data[1] . PHP_EOL;
});


$loop->run();

我的composer.json

代码语言:javascript
复制
{
    "require": {
        "react/promise": "2.2.0",
        "react/event-loop": "0.4.1",
        "cpliakas/git-wrapper": "1.4.1",
        "symfony/stopwatch": "2.7.0"
    }
}

操作系统: Windows7 PHP: 5.4.8和5.5.20

这些器皿都没有安装。

代码语言:javascript
复制
"suggest": {
    "ext-libevent": ">=0.1.0",
    "ext-event": "~1.0",
    "ext-libev": "*"
},

所以使用StreamSelectLoop

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-05 15:29:34

您正在处理的主要问题是$git->cloneRepository()调用阻塞;reactphp只允许处理应用程序级循环。如果您不使代码非阻塞,那么您的代码仍将以线性方式运行。您必须研究如何使克隆在后台发生;这可以通过分叉进程或调用另一个php脚本在后台运行来完成。我不确定像这样操作的git包装器,但是如果您能够找到一个以非阻塞方式执行git调用的库,那么您的问题将大部分得到解决。

ReactPHP没有把php变成非阻塞的,它只是提供了允许非阻塞技术的框架。如果代码块,将不会运行react循环。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30643201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档