mysql_pconnect(): 发送 5 个字节失败,errno=32 Broken pipe
Posted
技术标签:
【中文标题】mysql_pconnect(): 发送 5 个字节失败,errno=32 Broken pipe【英文标题】:mysql_pconnect(): send of 5 bytes failed with errno=32 Broken pipe 【发布时间】:2010-12-26 01:03:45 【问题描述】:多年来,我一直在使用同一个数据库抽象库。但今天它开始在我的日志中写入这些通知 (8) 消息。
应用程序工作正常,但每次脚本连接到数据库时都会记录相同的通知。
我想不出可能发生了什么变化。这发生在我的本地开发机器上。
OS X 10.6.2
php 5.3.0 (cli)
mysql Ver 14.12 Distrib 5.0.87
mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $
【问题讨论】:
您是否尝试通过命令行实用程序进行连接? mysqld 日志中是否也有类似/相关的内容? 我使用 mysql cli 客户端没有问题。正如我所说,mysqlnd 确实连接并且连接有效,但它现在每个 pconnect() 都会抛出这个通知。 mysqld 错误日志中没有任何记录。我确实设置了--log-warnings 哦,真烦人!我重新启动了 apache(我使用 apxs2 sapi),现在错误消息已经停止。现在要找到造成它们的原因并不容易。 【参考方案1】:我正在使用 PHP 5.6.20、PDO(仅抛出异常)和 MySQL 5.6.28 以及持久连接,一切都是 utf8mb4。我的整个堆栈都是为 utf-8 设置的(dsn 字符串设置、连接、数据库服务器数据库、表、列、Apache 2.4.12、PHP、所有网页、CSS ......你的名字)。
我间歇性地收到以下错误消息,令人费解且烦人。
注意:PDO::__construct(): send of 5 bytes failed with errno=32 Broken pipe in file /foo/bar/baz
假设一个持久连接是一个非交互式连接,MySQL 5.6 手册(5.1.4 服务器系统变量)对服务器系统变量wait_timeout
做了以下说明。
服务器等待活动的秒数 非交互式连接,然后关闭它。
默认:28800 秒
(28000 sec / 1) * (1 hour / 3600 sec) = 8 hours
最大:31536000 秒
((31536000 sec / 1) * (1 hr / 3600 sec) * (1 day / 24 hrs) = 365 days
因此,检查my.cnf
中的wait_timeout
并确定是否需要持久连接。 此外,您必须投资使您的应用程序更加健壮,以解决已断开的持久连接。显然,您不希望您的客户在第二天回来(已经离开晚上回家)然后说“这到底是怎么回事?!”
【讨论】:
【参考方案2】:目前我发现的唯一解决方案是改变
// From
PDO::ATTR_PERSISTENT => true
// To
PDO::ATTR_PERSISTENT => false
对此不太满意,但在此期间有效。 我正在使用一台非常旧的 PC 进行个人项目,所以我猜这个问题可能与缺乏资源有关。
【讨论】:
我注意到当我尝试使用持久连接时也开始发生这种情况。也许我错过了什么。【参考方案3】:只需删除 mysqlnd
驱动程序并使用 mysqli
是的mysqlnd
更现代,但稳定性呢?
下一个命令可以解决您的问题
apt-get 删除 php5-mysqlnd
apt-get 安装 php5-pdo-mysql
【讨论】:
对不起,你不知道你在说什么。 mysqlnd 是一个 PHP 扩展,mysql_*()
、mysqli 和 PDO API 可以使用它作为 libmysqlclient.so 中链接的替代方案,它可以在获取行时提高内存效率,并且由于更紧密的耦合而可能提高速度。 mysqlnd 似乎没有向 PHP 代码公开任何 API,只有其他扩展。【参考方案4】:
如果有人遇到这个问题,这里是解决方法:
尝试在您的 mysql my.cnf
配置文件中更改/设置 wait_timeout
:
wait_timeout=3600
此配置文件位于 /etc/mysql/my.cnf
(Ubuntu/Debian) 和 /usr/local/mysql/my.cnf
(OSX)。
重启mysql服务器,它应该可以工作了。
【讨论】:
【参考方案5】:这可能是因为您的数据包含“utf-8”字符。我有类似的问题是由它引起的。
异常:mysql_query():发送 1462592 字节失败,errno=32 Broken pipe
我用过
mysql -u username -p database < dump_file # this is bad
导入的sql文件包含很多UTF8字符(泰语),但是我没有为[mysql]设置default-character-set=utf8。所以数据库中错误的编码数据导致了这个问题。
【讨论】:
即使您将所有内容都设置为 utf-8,也会发生这种情况。这包括使用 utf8mb4。我正在使用 MySQL 5.6 和 PHP 5.6.20,但我仍然遇到了问题。我记得它是在我尝试实现持久连接时开始的。以上是关于mysql_pconnect(): 发送 5 个字节失败,errno=32 Broken pipe的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 错误:调用未定义的函数 mysql_pconnect()
mysql_connect VS mysql_pconnect [关闭]
如何修复未捕获的错误:调用未定义的函数 mysql_pconnect() [重复]