swoole / rfc

Swoole 提案
116 stars 3 forks source link

RFC-1024 在协程容器中默认开启协程 HOOK #71

Closed matyhtf closed 3 years ago

matyhtf commented 4 years ago

背景

在之前版本中,使用 sleepstream_socket_clientmysqli/redis 等 PHP 原生 IO 组件时,需要在协程容器中手动启用 HOOK,使用繁琐。为了解决这一问题,在协程容器启动时自动开启 Hook,可大量减少重复性的代码。

版本: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\Coroutine\Unsafe\blocking_call() 来实现关闭协程切换,实现原子调用。

  1. 关闭 CPU 中断调度器,防止从 VM 执行中中断
  2. 关闭 HOOK ,所有 IO 操作将转变为同步阻塞
Swoole\Coroutine\Unsafe\blocking_call(function () {
    // 这里将直接使用阻塞 IO
    sleep(1);
    $redis = new redis;
    $redis->connect('127.0.0.1', 6379);
    echo $redis->get("key");
});