Karp 的技术博客

首先注意

 '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

2019-09-04

协程服务注意事项 :
昨天测试服务修改 max_request = 1 导致大量协程请求失效, 该参数目的实现热更新不用重启swoole 服务即可更新代码 测试环境使用. 但使用协程服务时, worker 将任务丢入协程后 边重启..... 回包失败导致大量请求超时(进程死亡未主动挥手)...

php swoole

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2019年01月02日 06:01
10

目录

来自 《[踩坑] Swoole 4.2 协程》
774 文章数
0 评论量
9 分类数
779 页面数
已在风雨中度过 9年277天3小时32分