Runtime
最后更新于:2022-04-02 06:30:41
# Runtime
[TOC]
在`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`或更高版本可用,请参考:[开关选项](开关选项.md)
## 可用列表
* `redis`扩展
* 使用`mysqlnd`模式的`pdo`、`mysqli`扩展,如果未启用`mysqlnd`将不支持协程化
* `soap`扩展
* `file_get_contents`、`fopen`
* `stream_socket_client`(predis)
* `stream_socket_server`
* `fsockopen`
## 不可用列表
* `mysql`:底层使用`libmysqlclient`
* `curl`:底层使用`libcurl`(即不能使用`CURL`驱动的`Guzzle`)
* `mongo`:底层使用`mongo-c-client`
* `pdo_pgsql`
* `pdo_ori`
* `pdo_odbc`
* `pdo_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等回调中开启, 会多次调用造成不必要的调用开销.
';