我如何使用reactphp编写php异步函数

时间:2018-10-30 07:40:50

标签: php asynchronous reactphp

我认为我可以同时做更多事情,所以我开始使用reactphp。 代码运行得很好,但是我想确保代码确实是异步的,我尝试了下面的代码,这给了我信心,它回响了字符串“以自然顺序”,例如“一二三四...”,但是我就像javascript中一样,正在寻找“一四三二...”之类的输出。

function callDone(){
    $g = 'abcdefghuytegbnwsgwseeveddvvdvdcvdvbshasfcfddbbcdgcdvoiuyyttreewwaazxcvbnjjjhgfffhhhabcdefghuytegbnwsgwseeveddvvdvdcvdvbshasfcfddbbcdgcdvoiuyyttreewwaazxcvbnjjjhgfffhhh';
    $r = str_split($g);
    for($i=0;$i<count($r);$i++){
        $g .= $r[$i];
    }
    return 1;
}
$promise = new React\Promise\Promise(function($resolve){
    echo microtime(true). "<br>start<br>";
    $resolve(callDone());
}
$promise->then(function($v){
    echo 'one<br>';
});
$promise->then(function($v){
    echo 'two<br>';
});
$promise->then(function($v){
    echo 'three<br>';
});
$promise->then(function($v){
    echo 'four<br>';
});
$promise->then(function($v){
    echo 'five<br>';
});

这将打印 “一二三四五”,但我需要乱序,例如:“一三二...”,以确认这确实是异步的。 任何帮助都在此先感谢。

1 个答案:

答案 0 :(得分:1)

您的示例的问题是期望这些调用应该是某种随机的。 ReactPHP的异步方面主要来自必须非阻塞的事件循环(如您在以下评论之一中提到的)。不使用事件循环意味着您正在使用PHP的标准调用堆栈。

如果您希望看到“更异步”的方法,则可以稍微修改一下代码。

$loop = \React\EventLoop\Factory::create();

function callDone(){
    $g = 'abcdefghuytegbnwsgwseeveddvvdvdcvdvbshasfcfddbbcdgcdvoiuyyttreewwaazxcvbnjjjhgfffhhhabcdefghuytegbnwsgwseeveddvvdvdcvdvbshasfcfddbbcdgcdvoiuyyttreewwaazxcvbnjjjhgfffhhh';
    $r = str_split($g);
    for($i=0;$i<count($r);$i++){
        $g .= $r[$i];
    }
    return 1;
}
$promise = new React\Promise\Promise(function($resolve){
    echo microtime(true). "<br>start<br>";
    $resolve(callDone());
});

$promise->then(function($v) use ($loop) {
    $loop->addPeriodicTimer(0.1, function () {
        echo 'one<br>';
    });
});

$promise->then(function($v) use ($loop) {
    $loop->addPeriodicTimer(0.2, function () {
        echo 'two<br>';
    });
});
$promise->then(function($v){
    echo 'three<br>';
});
$promise->then(function($v){
    echo 'four<br>';
});
$promise->then(function($v){
    echo 'five<br>';
});

$loop->run();

我们在您的代码中添加了事件循环,以开始一种更加异步的方法。 这将为您的示例添加一个异步时间,该时间每隔0.1秒回响“一个”,每隔0.2秒回响“两个”。如您所见,这两个计时器不会互相阻塞,因为事件循环会处理这些计时器。 我希望这会有所帮助!