首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程Pdo并发写入报错
### 问题描述 协程并发,pod->execute() 执行报错,报错信息如下 CDbCommand 无法执行 SQL 语句: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (framework/db/CDbCommand.php:411) ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本:4.6.1 PHP版本:7.2.7 操作系统:Centos 7.2.7 ### 相关代码 ```php $chan = new \Swoole\Coroutine\Channel($xcNums); \Swoole\Coroutine::create(function () use ($chan) { $arrHeader = []; $context = \Co::getContext(); $context->bizLog = clone $bizLog; $context->bizObj = new test(); while (true) { $message = $chan->pop(); $start = microtime(true) * 1000; $startTime = microtime(true); $arrMessage = json_decode($message->payload, true); $retryNums = 1 $re = $bizObj->consumeMessage($arrMessage); //里面是读写数据库的操作 } }); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于5年前 · 32 次浏览 · 来自
提问
易难
### 问题描述 协程并发,pod->execute() 执行报错,报错信息如下 CDbCommand 无法执行 SQL 语句: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (framework/db/CDbCommand.php:411) ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本:4.6.1 PHP版本:7.2.7 操作系统:Centos 7.2.7 ### 相关代码 ```php $chan = new \Swoole\Coroutine\Channel($xcNums); \Swoole\Coroutine::create(function () use ($chan) { $arrHeader = []; $context = \Co::getContext(); $context->bizLog = clone $bizLog; $context->bizObj = new test(); while (true) { $message = $chan->pop(); $start = microtime(true) * 1000; $startTime = microtime(true); $arrMessage = json_decode($message->payload, true); $retryNums = 1 $re = $bizObj->consumeMessage($arrMessage); //里面是读写数据库的操作 } }); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-01-19
鲁飞
这个报错是因为你用法有问题
赞
0
回复
2021-01-19
易难
下面那个变量是$context->bizObj 我贴错了,是一的 说详细点呢,我们用yii 框架
赞
0
回复
2021-01-19
易难
能具体点吗?是因为公用了一个连接?
赞
0
回复
2021-01-19
鲁飞
回复
易难
嗯。并发下连接不够用
赞
0
回复
2021-06-05
zhuoxin
大佬,这个问题解决了吗?我也遇到了,不知道咋搞了
赞
0
回复
2021-06-08
易难
回复
zhuoxin
每个协程用一个连接资源
赞
0
回复
2021-06-06
MARiA
你好,该错误指的是$bizObj->consumeMessage($arrMessage)调用了查询方法,但是还没等到该查询返回完整的数据集,又使用了该数据库连接发起了新的查询。MySQL不允许在没有获取到全部的结果集之前又发起一次新查询。 请看有没有循环中每调用一次fetch,又用这个连接发起新的查询。 或者你用的是协程方式,注意是不是多个协程共用一个连接。
赞
0
回复