从异步PHP

时间:2016-05-05 13:31:30

标签: php asynchronous

我想从PHP中的异步函数返回一个值...我在这里使用icicle.io,但我很乐意使用任何东西,只要它能做我想做的事情!无论如何,这是下面的一些代码

<?php

require __DIR__ . '/vendor/autoload.php';

use Icicle\Coroutine\Coroutine;
use Icicle\Loop;

function getArray($int) {
    yield array ($int, $int + 1, $int + 2);
}

function getArrays() {
    $numbers = array (1, 4, 7);
    $results = array();

    foreach ($numbers as $number) {
        array_push($results, (yield(getArray($number))));
    }

    yield call_user_func_array('array_merge', $results);
}

$coroutine = new Coroutine(getArrays());

$data = $coroutine->then(
    function ($result) {
        $data = print_r($result, true);
        return "Result: {$data}\n";
    },
    function (Exception $e) {
        echo "Error: {$e->getMessage()}\n";
    }
)->done(function ($value) {
    echo $value;
});

Loop\run();

真正喜欢做的是将最后一点放在一个函数中,所以看起来更像是这样:

function sync() {
    $coroutine = new Coroutine(getArrays());

    $data = $coroutine->then(
        function ($result) {
            $data = print_r($result, true);
            return "Result: {$data}\n";
        },
        function (Exception $e) {
            echo "Error: {$e->getMessage()}\n";
        }
    )->done(function ($value) {
        return $value;
    });

    Loop\run();

    return /* the value */;
}

然后从我的酷软件中,我可以调用sync(),就像它是一个同步函数一样,幸福地不知道幕后发生的异步恶作剧。

有没有人这样做过,或者对我的方式有一些建议?目前 best 我想出的是(ab)使用输出缓冲区&amp; serialize() / unserialize()功能,但由于我是出于改善性能的一切愿望而做的,这似乎相当倒退!!

1 个答案:

答案 0 :(得分:1)

您可以使用wait()方法同步等待Awaitable(包括Coroutine)的分辨率。此方法勾选事件循环,直到协程解析为止。这意味着您的sync()函数可以简单地在coroutine对象上调用此方法并返回结果。

function sync() {
    $coroutine = new Coroutine(getArrays());
    return $coroutine->wait();
}