-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Swoole 4.6.1、Swoole 5.1.6、Swoole 6.0.0 验证协程客户端PgSql 无异步效果(Swoole 4.6.1, Swoole 5.1.6, Swoole 6.0.0 verify that the coroutine client PgSql has no asynchronous effect) #5635
Comments
<?php
use Swoole\Coroutine;
use Swoole\Coroutine\PostgreSQL;
use function Swoole\Coroutine\run;
run(function () {
for ($i = 1;$i <= 2;$i++) {
Coroutine::create(function () use ($i) {
$pg = new PostgreSQL();
$conn = $pg->connect(sprintf(
'host=%s port=%s dbname=%s user=%s password=%s',
'xxx',
5432,
'xxx',
'xxx',
'xxx'
));
if (!$conn) {
var_dump($pg->error);
return;
}
$stmt = $pg->query('SELECT * FROM tab limit 3;');
$arr = $pg->fetchAll($stmt);
var_dump($i . ' :rows num=' . count($arr));
});
}
var_dump(666);
sleep(8);
var_dump(888);
}); run函数内部才是协程环境,外部是非协程环境,所以先执行postgresql查询,执行完才会这行下面的逻辑,类似下面的执行。 |
你好!感谢解答,我上面测试示例写错了,然后按你说的将三行代码挪到run()内部,是可以切换,但效果不同,分别如下:
结果:
限制返回数据量的 SQL 正常如期响应,此时我模拟那种很久响应的场景==将 SQL 改成 同理,我在Swoole 5.1.6 与 Swoole 6.0.0(使用 HOOK设置标记SWOOLE_HOOK_PDO_PGSQL + PDO),测试代码和结果如下
结果 帮忙再确认下当遇到这种响应很久的 SQL 时,$channel->pop($timeout)是否无法被执行到 |
$channel->pop($timeout)已经执行到了,只不过在等待postgresql返回结果 |
假如执行到的话,正常逻辑不是会在 $timeout 到时就触发超时停止吗?目前就是卡住了,请问有办法处理吗?目前效果是一旦出现这种情况相当于,其它代码都执行不了了(无法响应)。 |
strace -p 进程ID,查看一下当前进程在执行什么逻辑。 |
|
strace -p $pid
|
|
#5637 测试是没什么问题的 有一种可能是你的程序在不断地从postgresql获取数据,这个时候的文件描述符都是可读可写的,此时是不会发生协程切换的。 |
这应该是 hook 不生效导致的,你需要检查一下扩展加载顺序,swoole 扩展要晚于 pdo_pgsql 被加载。或者直接禁用 pdo_pgsql 扩展 |
回复 @matyhtf |
@yibin94 你试试在阻塞的时候,使用 gdb -p PID 追踪进程,然后使用 bt 指令打印一下进程在哪段代码中发生了阻塞循环 |
@matyhtf 你好,以下是Swoole 6.0.0 执行gdb -p $pid, bt 指令执行后的打印内容
|
你的全表大概有多少数据,可以的话,能贴一下这张表的定义吗 |
@NathanFreeman 其中一个表(12.9 w 数据量)的定义如下
|
找到原因了,我晚上提交个PR修复它 |
@NathanFreeman 好的 谢谢!4.x和5.x版本也可抽空看看是否一样的问题,我目前实际在用是Hyperf2.2(Swoole4.8.11)用swoole/ext-postgresql(最新版是4.8.0)编译安装不过,是否得降版本(我上面测试是用的低版本4.6.1)或升版本(5.x\6.x)? |
Please answer these questions before submitting your issue.
Hyperf2.2项目,Swoole版本是4.8.11,需要使用协程客户端的PgSql,4.x版本需要额外编译swoole/ext-postgresql(最新版是v4.8.0),
于是另外找了个4.6.1的版本去验证协程效果,Swoole和ext-postgresql版本信息如下:
验证得出结论:4.6.1、5.1.6、6.0.0 都没有协程PgSql的异步效果,是同步阻塞,希望能得到解答,确认是我这边哪里疏忽还是说是bug
code: (Swoole 4.6.1、Swoole 5.1.6)
code: (Swoole 5.1.6、Swoole 6.0.0)
或
What did you expect to see?
遇到数据库查询,先切换到外部协程打印数字,而不是一直阻塞等数据库查询返回结果。
What did you see instead?
php --ri swoole
)?Swoole 4.6.1
php --ri swoole_postgresql
Swoole 5.1.6 (dockerfile)
Swoole 6.0.0 (dockerfile)
uname -a
&php -v
&gcc -v
) ?The text was updated successfully, but these errors were encountered: