创建一个新的协程,并立即执行。
function Swoole\Coroutine::create(callable $function);
$function
协程执行的代码,系统能创建的协程总数量受限于server->max_coroutine
设置true
,失败返回false
在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
创建的子协程会优先执行,子协程执行完毕或挂起时,将重新回到父协程向下执行代码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
版本中底层会分配8K
的stack
来存储协程的变量,zval
的尺寸为16
字节,因此8K
的stack
最大可以保存512
个变量。协程栈内存占用超过8K
后ZendVM
会自动扩容。
协程退出时会释放申请的stack
内存。
PHP-7.1
、PHP-7.0
默认会分配256K
栈内存
可调用Co::set(['stack_size' => 4096])
修改默认的栈内存尺寸