首先注意
'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
将任务丢入协程后 边重启..... 回包失败导致大量请求超时(进程死亡未主动挥手)...