如何使用 reactphp 编写 php 异步函数
How to can I write php asynchroneous functions using reactphp
我认为我可以同时做更多事情,所以我开始使用 reactphp。
代码运行得很好,但我想确定代码确实是异步的就像 "one four three two..." 就像它发生在 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>';
});
这将打印
"one two three four five" 但是我需要一些乱序的东西,比如:"one three two..." 来确认这真的是异步的。
提前感谢任何帮助。
您的示例的问题在于期望这些调用应该是某种随机的。 ReactPHP 的异步方面主要来自事件循环,它 必须是 非阻塞的(正如您在下面的评论之一中提到的)。不使用事件循环意味着您正在使用 PHP.
的标准调用堆栈
如果您想查看 "more asynchronous" 方法,您可以稍微修改一下代码。
$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 秒回显 "one",每 0.2 秒回显一次 "two"。正如您所见,这两个计时器不会相互阻塞,因为事件循环会处理这些计时器。
希望对您有所帮助!
我认为我可以同时做更多事情,所以我开始使用 reactphp。 代码运行得很好,但我想确定代码确实是异步的就像 "one four three two..." 就像它发生在 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>';
});
这将打印 "one two three four five" 但是我需要一些乱序的东西,比如:"one three two..." 来确认这真的是异步的。 提前感谢任何帮助。
您的示例的问题在于期望这些调用应该是某种随机的。 ReactPHP 的异步方面主要来自事件循环,它 必须是 非阻塞的(正如您在下面的评论之一中提到的)。不使用事件循环意味着您正在使用 PHP.
的标准调用堆栈如果您想查看 "more asynchronous" 方法,您可以稍微修改一下代码。
$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 秒回显 "one",每 0.2 秒回显一次 "two"。正如您所见,这两个计时器不会相互阻塞,因为事件循环会处理这些计时器。 希望对您有所帮助!