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
4.4.0
起支持SWOOLE_HOOK_CURL
, 暂未实验性选项, 默认不开启
函数原型
function Runtime::enableCoroutine(bool $enable = true, int $flags = SWOOLE_HOOK_ALL);
function Runtime::enableCoroutine(int $flags = SWOOLE_HOOK_ALL);
$enable
:打开或关闭协程$flags
:选择要Hook
的类型,可以多选,默认为全选。仅在$enable = true
时有效
$flags
参数在4.2
或更高版本可用,请参考:开关选项
4.3.2
或更高版本中, 支持上述第二种原型所示的方式调用(即第一个参数为flag)
配置选项
在4.4
版本中可以使用Coroutine::set
或Coroutine\Scheduler::set
方法中设置hook_flags
选项设置运行时协程Hook
。
Corouitne::set([
'hook_flags' => SWOOLE_HOOK_ALL,
]);
可用列表
redis
扩展- 使用
mysqlnd
模式的pdo_mysql
、mysqli
扩展,如果未启用mysqlnd
将不支持协程化 soap
扩展file_get_contents
、fopen
stream_socket_client
(predis, php-amqplib)stream_socket_server
stream_select
(需要4.3.2
以上版本)fsockopen
proc_open
(需要4.4.0
以上版本)
不可用列表
mysql
:底层使用libmysqlclient
mongo
:底层使用mongo-c-client
pdo_pgsql
pdo_ori
pdo_odbc
pdo_firebird
实验性列表
curl
:底层使用libcurl
(即不能使用curl
驱动的Guzzle
), 但可通过显式设置SWOOLE_HOOK_CURL
开启实验性的HOOK
使用实例
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%覆盖的效果 一旦开启,相关函数就无法在非协程环境使用
注意: 不建议放在onRequest等回调中开启, 会多次调用造成不必要的调用开销.