Closed hiwhm closed 3 years ago
这里应该是跨协程调用了
这里应该是跨协程调用了
这是在 BaseModel 获取连接时的处理
public function setPdo($pdo) {
$cuid = Coroutine::getuid();
if (empty($this->pdos[$cuid])) {
$this->pdos[$cuid] = $pdo;
}
}
public function getPdo() {
$cuid = Coroutine::getuid();
if (empty($this->pdos[$cuid])) {
echo "BaseModel getPdo null".PHP_EOL;
return null;
}
return $this->pdos[$cuid];
}
难道是这里的代码没有生效....,在开启一键协程化后,同一cpu时间内有多个连接进来是不是可以用go方法加多一层协程来隔离,或者有更好的解决方法,求思路
已找到解决方法, 问题原因可能是一个进程内多个协程共用一个 BaseModel 实例导致的, 解决办法 BaseModel 内区分协程上下文。
每次 new 一个 Model 对象应该就好了吧
我就是掉坑里了, 加了个 单例方法。。
报错日志
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=true 已开启 BaseModel 实例方法
swoole 配置
我排查了下,发现 quote 方法不能正确的返回,我使用了medoo2.1的 quote处理方法进行替换,发现报错次数有明显减少。 但是以上的报错问题还是存在,我想到的可能是上条查询语句 exec PDO::prepare 实际执行了但没完全返回或者报错,导致后一条语句出现上面问题。