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

如何使用php编写php异步函数,php,asynchronous,reactphp,Php,Asynchronous,Reactphp,我认为我可以在同一时间做更多的事情,所以我开始使用PHP。 代码运行得很好,但我想确保代码确实是异步的,我尝试了下面的代码,这让我没有信心,它以“自然顺序”响应字符串,如“一二三四…”,但我正在寻找像“一四三二…”这样的输出,就像在javascript中一样 函数callDone(){ $g='ABCDEFGHUYTEGBNWSEEDDVDVDVDVBSHASFCFDBCCDDVOIUYYTTREEWAAZVCVBNJJJJHGFFHHABCDFGHUYTEGBNWSEEDDVDVDVDVDV

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

函数callDone(){
$g='ABCDEFGHUYTEGBNWSEEDDVDVDVDVBSHASFCFDBCCDDVOIUYYTTREEWAAZVCVBNJJJJHGFFHHABCDFGHUYTEGBNWSEEDDVDVDVDVDVBSHASFCDBCDGCDVOIUYTTREEWAAZVCVBNJJJHGFFHHHHHHH';
$r=str_分割($g);
对于($i=0;$ithen)(函数($v){
呼应“一个
”; }); $PROMITE->then(函数($v){ 呼应“两个
”; }); $PROMITE->then(函数($v){ 呼应“三个
”; }); $PROMITE->then(函数($v){ 呼应“四个
”; }); $PROMITE->then(函数($v){ 呼应“五个
”;
})
您的示例的问题是期望这些调用应该是某种随机的。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();
$loop=\React\EventLoop\Factory::create();
函数callDone(){
$g='ABCDEFGHUYTEGBNWSEEDDVDVDVDVBSHASFCFDBCCDDVOIUYYTTREEWAAZVCVBNJJJJHGFFHHABCDFGHUYTEGBNWSEEDDVDVDVDVDVBSHASFCDBCDGCDVOIUYTTREEWAAZVCVBNJJJHGFFHHHHHHH';
$r=str_分割($g);
对于($i=0;$i)函数($v)使用($loop){
$loop->addPeriodicTimer(0.1,函数(){
呼应“一个
”; }); }); $promise->then(函数($v)使用($loop){ $loop->addPeriodicTimer(0.2,函数(){ 呼应“两个
”; }); }); $PROMITE->then(函数($v){ 呼应“三个
”; }); $PROMITE->then(函数($v){ 呼应“四个
”; }); $PROMITE->then(函数($v){ 呼应“五个
”; }); $loop->run();
我们在代码中添加了事件循环,以启动一种更异步的方法。 这将为您的示例添加一个异步时间,该时间将每0.1秒回显“1”,每0.2秒回显“2”。正如您可能看到的,这两个计时器不会相互阻塞,因为事件循环处理这些计时器。
我希望这能有所帮助!

PHP总是一行一行地进行,并等待前一行完成后再继续。我不太明白,您计划实现什么:/n您可以尝试添加
sleep(1);
调用一个函数,然后查看其他项是否在它之前完成。reactphp的概念宣称异步代码执行,但它们的示例似乎只涉及非阻塞I/O操作事件循环…我需要一个真正使用reactphp的人获取同步代码的异步结果您应该将进程拆分为至少两个队列