Coroutine::create

创建一个新的协程,并立即执行。

function Swoole\Coroutine::create(callable $function);

2.1.0或更高版本中如果开启了swoole.use_shortname,可以直接使用go关键词创建新的协程。

go(function () {
    $db = new Co\MySQL();
    $server = array(
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => 'root',
        'database' => 'test',
    );

    $db->connect($server);

    $result = $db->query('SELECT * FROM userinfo WHERE id = 3');
    var_dump($result);
});

执行顺序

在一个协程中使用go嵌套创建新的协程。因为Swoole的协程是单线程模型,因此:

go(function() {
    go(function () {
        co::sleep(3.0);
        go(function () {
            co::sleep(2.0);
            echo "co[3] end\n";
        });
        echo "co[2] end\n";
    });

    co::sleep(1.0);
    echo "co[1] end\n";
});

协程开销

协程需要创建单独的内存栈,在PHP-7.2版本中底层会分配8Kstack来存储协程的变量,zval的尺寸为16字节,因此8Kstack最大可以保存512个变量。协程栈内存占用超过8KZendVM会自动扩容。

协程退出时会释放申请的stack内存。

PHP-7.1PHP-7.0默认会分配256K栈内存
可调用Co::set(['stack_size' => 4096])修改默认的栈内存尺寸