php多进程引发mysql查询问题

1、报错:Packets out of order. Expected 1 received 56. Packet size=3159346

开始配置my.cnf 的 max_allowed_packet=2G 可是没什么卵用

原因:个人判断是因在laravel mysql的连接是随着php销毁而销毁;所以会保持数据库的连接会话能重复使用

所以要配置database.php   配置文件options 

'options' => [
\PDO::ATTR_PERSISTENT => false, /*使用pda连接会话持久化*/
]

注解:

建立PDO持久化连接只需要在PDO构造函数的第4个参数(该参数为可选参数,是一个包含多个驱动选项参数的数组)中设置键名PDO::ATTR_PERSISTENT的值为true即可。

使用new PDO()语句创建一个数据库连接,当连接数据库成功后,将会得到一个PDO类的实例,此连接在PDO对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个NULL值给对象变量。如果不明确地这么做,PHP在脚本结束时会自动关闭连接。

创建的数据连接为PDO持久化连接时,该连接在使用完毕或者PHP脚本结束后并不会被关闭,而是被PHP缓存起来。当另一个使用相同凭证(主机、端口、数据库名、用户名、密码等信息完全一致)的PHP脚本请求建立连接时,PHP将直接返回之前被缓存起来的连接,从而达到连接重用。持久连接缓存可以避免每次访问数据库都要建立一个新连接的开销。

 

2、报错:Illuminate\Database\QueryException : Wrong COM_STMT_PREPARE response size. Received 1

个人判断是因为高并发下mysql不断向服务端预处理造成的问题

所以要配置database.php   配置文件options 

'options' => [
  \PDO::ATTR_EMULATE_PREPARES => true,
]

1、ATTR_EMULATE_PREPARES=true(默认)
含义:本地prepare
详细:prepare不发送,execute时发送完整的sql
优点:当代码里频繁prepare,prepare放在本地,减轻mysql服务器压力
缺点:sql注入需要自己防范
注意:会把数据库数据由int类型转成string,如果php跟object-c合作,可能有问题。需慎重!!!


2、ATTR_EMULATE_PREPARES=false
含义:服务端(mysql)prepare
详细:prepare时「query+占位符」发给服务端
优点:1、防sql注入;2、当代码里prepare少时性能更好
缺点:1、高并发,频繁prepare,会有性能问题;2、慢日志里是占位符

posted @ 2024-03-15 13:13  做人如水,做事如山  阅读(26)  评论(0编辑  收藏  举报