Closed matyhtf closed 3 years ago
在之前版本中,使用 sleep、stream_socket_client、mysqli/redis 等 PHP 原生 IO 组件时,需要在协程容器中手动启用 HOOK,使用繁琐。为了解决这一问题,在协程容器启动时自动开启 Hook,可大量减少重复性的代码。
sleep
stream_socket_client
mysqli/redis
版本:v4.6
v4.6
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL); Swoole\Coroutine\run(function () { sleep(1); $redis = new redis; $redis->connect('127.0.0.1', 6379); echo $redis->get("key"); });
Swoole\Coroutine\run(function () { // 不需要设置 HOOK,底层自动启用,直接使用原生 PHP 阻塞 IO API 即可,底层自动替换 sleep(1); $redis = new redis; $redis->connect('127.0.0.1', 6379); echo $redis->get("key"); });
Swoole\Runtime::enableCoroutine()
hook_flags
HOOK
底层增加 Swoole\Coroutine\Unsafe\blocking_call() 来实现关闭协程切换,实现原子调用。
Swoole\Coroutine\Unsafe\blocking_call()
Swoole\Coroutine\Unsafe\blocking_call(function () { // 这里将直接使用阻塞 IO sleep(1); $redis = new redis; $redis->connect('127.0.0.1', 6379); echo $redis->get("key"); });
背景
在之前版本中,使用
sleep
、stream_socket_client
、mysqli/redis
等 PHP 原生 IO 组件时,需要在协程容器中手动启用 HOOK,使用繁琐。为了解决这一问题,在协程容器启动时自动开启 Hook,可大量减少重复性的代码。版本:
v4.6
修改前
修改后
影响
Swoole\Runtime::enableCoroutine()
或设置hook_flags
的程序,底层不执行任何操作,是完全兼容的HOOK
并且代码中又使用了 PHP 的 阻塞 IO 函数,开发者预期是非阻塞行为,实际情况是会出现阻塞,导致程序无法正常运行HOOK
,在特例代码执行完成后再恢复HOOK
。设计框架时,无法预知用户是否开启了HOOK
,如果存在特例,必须要判断当前是否处于HOOK
开启模式,这是框架本应该做到的。底层自动开启HOOK
的行为,对于框架开发者来说无实际影响优化
底层增加
Swoole\Coroutine\Unsafe\blocking_call()
来实现关闭协程切换,实现原子调用。