Как я могу написать php асинхронные функции с использованиемactphp - PullRequest
0 голосов
/ 30 октября 2018

Я думал, что смогу сделать больше одновременно, поэтому я начал с responsephp. Код работает так хорошо, но я хотел убедиться, что код действительно был асинхронным, я попробовал приведенный ниже код, который не давал мне уверенности, он повторял строки «в естественном порядке», как «один два три четыре ...», но я искал вывод типа «один четыре три два ...», как это происходит в 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 голосов
/ 30 октября 2018

Проблема с вашим примером - ожидание того, что эти вызовы должны быть случайными. Асинхронный аспект 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 секунды. Как вы можете видеть, эти два таймера не будут блокировать друг друга, потому что цикл обработки обрабатывает эти таймеры. Надеюсь, это поможет!

...