- Runtime
- 函数原型
- 可用列表
- 不可用列表
- 使用实例
- 方法摆放位置
Runtime
在4.1.0版本中,底层增加一个新的特性,可以在运行时动态将基于php_stream实现的扩展、PHP网络客户端代码一键协程化。底层替换了ZendVM Stream的函数指针,所有使用php_stream进行socket操作均变成协程调度的异步IO。
目前有PHP原生Redis、PDO、MySQLi协程化的支持。
4.1版本仅支持tcp和unix两种stream类型4.2版本增加了对udp、udg、unix、ssl、tls类型的支持4.2.3版本以前存在FILE_HOOK覆盖include/require的BUG, 请通过Swoole\Runtime::enableCoroutine(true, SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_FILE);的方式屏蔽file hook
函数原型
function Runtime::enableCoroutine(bool $enable = true, int $flags = SWOOLE_HOOK_ALL);
$enable:打开或关闭协程$flags:选择要Hook的类型,可以多选,默认为全选。仅在$enable = true时有效
$flags参数在4.2或更高版本可用,请参考:开关选项
可用列表
redis扩展- 使用
mysqlnd模式的pdo、mysqli扩展,如果未启用mysqlnd将不支持协程化 soap扩展file_get_contents、fopenstream_socket_client(predis)stream_socket_serverfsockopen
不可用列表
mysql:底层使用libmysqlclientcurl:底层使用libcurl(即不能使用CURL驱动的Guzzle)mongo:底层使用mongo-c-clientpdo_pgsqlpdo_oripdo_odbcpdo_firebird
使用实例
Swoole\Runtime::enableCoroutine();go(function () {$redis = new redis;$retval = $redis->connect("127.0.0.1", 6379);var_dump($retval, $redis->getLastError());var_dump($redis->get("key"));var_dump($redis->set("key", "value2"));var_dump($redis->get("key"));$redis->close();});
方法摆放位置
调用方法后当前进程内全局生效, 一般放在整个项目最开头以获得100%覆盖的效果, 协程内外会自动切换模式, 不影响PHP原生环境使用.
注意: 不建议放在onRequest等回调中开启, 会多次调用造成不必要的调用开销.
