LEN

Swoole 4.2 协程踩坑
首先注意 'enable_coroutine' => false, // 是否自动开启协程 ...
扫描右侧二维码阅读全文
02
2019/01

Swoole 4.2 协程踩坑

首先注意

   
 'enable_coroutine' => false,     // 是否自动开启协程 默认 true

我当然false 手动 go 调用协程 先踩小坑

 go(): Using Xdebug in coroutines is extremely dangerous, please notice that it may lead to coredump! i

写了个接口测试下 就抛错了 , xdebug 不让用 说危险...

今天填下坑 2019/01/09 韩大大来做分享, 顿时觉得协程好牛逼!! 因为协程可以无限起.

Demo 示例:

    public function coTest()
    {
        go(function () {


            $time = time();
            $chan = new Coroutine\Channel();
            go(function () use ($chan) {
                co::sleep(1);

                $chan->push(1);
            });

            go(function () use ($chan) {
                co::sleep(1);
                $chan->push(2);
            });

            for ($i = 0; $i < 2; $i++) {
                echo $chan->pop(), PHP_EOL;
                echo 'pop :', time() - $time, PHP_EOL;
            }
        });
    }

php cli.php Tests coTest
game over
1
pop :1
2
pop :1

屌屌的 同一秒结束任务, 厉害了. 试想下以后写爬虫, 大流量访问worker 数不足等场景 都可以解决了, 只要内存足够, 协程就可以无限生成.

Swoole 4.2.3 以后 还有 使用 Swoole\Runtime::enableCoroutine() 方法 可以使原生方法:

可用列表

redis扩展
使用mysqlnd模式的pdo、mysqli扩展,如果未启用mysqlnd将不支持协程化
soap扩展
file_get_contents、fopen
stream_socket_client (predis)
stream_socket_server
fsockopen

其他方法只能等更新了 , swoole & php 以后会越来越好, 感谢热爱开源, 乐于分享的人.

2019/01/21 更新下新踩到的坑

我写了这样一个服务 里面接口有大量的代理请求中转接口 A 和 协程调用第三方接口 B.
在测试环境少量请求时效果不错, 使用协程大大的降低了 调用 B 接口的响应时间, 单在测试环境中全量测试, 大量的请求 A 接口,
因为并没有做worker 进程分配规则, 都是随机分配, 导致 协程调用 B 接口 特别慢, 经过测试找出原因应该就是 B 接口协程调用因为IO操作会让出worker进程给 A 接口请求.

参考地址: https://wiki.swoole.com/wiki/page/965.html

Last modification:January 21st, 2019 at 06:54 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment