mysql_pconnect():发送5个字节失败,errno=32 Broken pipe。

7

多年来,我一直使用同一款DB抽象库。但是今天它开始在我的日志中写入这些Notice (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 $

你尝试过使用命令行工具连接吗? - Ivan Nevostruev
MySQL日志中是否也有类似或相关的内容? - VolkerK
我使用mysql cli客户端没有问题。就像我说的,mysqlnd确实连接并且连接工作正常,但是现在每次pconnect()都会抛出这个通知。 - user213154
不在mysqld错误日志中记录任何内容。 我确实设置了--log-warnings。 - user213154
哦,真是烦人啊!我重新启动了 Apache(我使用 apxs2 sapi),现在错误信息停止了。现在要找出导致这些错误的原因就不那么容易了。 - user213154
如果您重新启动了Apache,但错误仍然会发生,那么我的猜测是超时和mysqlnd(不太)静默重新连接。 - VolkerK
5个回答

13

如果有人遇到这个问题,请尝试在您的MySQL my.cnf配置文件中更改/设置wait_timeout

wait_timeout=3600

这个配置文件位于/etc/mysql/my.cnf(Ubuntu/Debian)和/usr/local/mysql/my.cnf(OSX)。

重新启动mysql服务器,它应该能工作。


3
到目前为止,我找到的唯一解决方案是更改。
// From
PDO::ATTR_PERSISTENT => true
// To
PDO::ATTR_PERSISTENT => false

虽然不太满意,但目前能用。 我正在使用一台非常老旧的个人电脑进行项目开发,因此我猜测问题可能与资源不足有关。


我注意到当我尝试使用持久连接时,这种情况开始发生。也许我漏掉了什么。 - Anthony Rutledge

2
我正在使用PHP 5.6.20、PDO(仅抛出异常)和MySQL 5.6.28,使用持久连接,所有内容都是utf8mb4。我的整个程序堆栈都已经设置为utf-8(dsn字符串设置、连接、数据库服务器、数据库、表、列、Apache 2.4.12、PHP、所有网页、CSS...等等)。
我偶尔会收到以下错误消息,这令人困惑和烦恼。
警告:PDO::__construct():在文件/foo/bar/baz中发送5字节失败,errno=32 Broken pipe 假设“持久连接”是一种“非交互式”的连接,则MySQL 5.6手册(5.1.4 Server System Variables)对于服务器系统变量wait_timeout有以下说明。
引用:

非交互式连接关闭之前服务器等待活动的秒数。

默认值:28800秒
(28000秒/1) * (1小时/3600秒) = 8小时
最大值:31536000秒
((31536000 sec / 1) * (1 hr / 3600 sec) * (1 day / 24 hrs) = 365 days

因此,在您的my.cnf中检查wait_timeout,并决定是否需要持久连接。 此外,您必须投入更多精力来使您的应用程序更加强大,以应对已断开的持久连接。 显然,您不希望客户在第二天回来(晚上回家了)并说:“到底发生了什么?!”

0

这可能是因为您的数据包含'utf-8'字符。我曾经遇到过类似的问题,也是由此引起的。

异常:mysql_query():发送1462592字节失败,errno=32 Broken pipe

我使用了

mysql -u username -p database < dump_file # this is bad 

我要导入一个包含很多UTF8字符(泰语)的SQL文件,但是我没有为[mysql]设置default-character-set=utf8。因此,数据库中错误编码的数据导致了这个问题。


即使您已将所有内容设置为utf-8,这种情况仍可能发生。这包括使用utf8mb4。我正在使用MySQL 5.6和PHP 5.6.20,但仍然遇到了问题。我记得当我尝试实现持久连接时它开始出现。 - Anthony Rutledge

-1

只需删除 mysqlnd 驱动程序并使用 mysqli。 是的,mysqlnd 更现代,但稳定性如何呢? 下一条命令可以解决您的问题

apt-get remove php5-mysqlnd

apt-get install php5-pdo-mysql


很抱歉,但您并不知道自己在说什么。mysqlnd是一种PHP扩展,可用于mysql_*()、mysqli和PDO API,作为链接libmysqlclient.so的替代方案,这样可以更好地提高内存效率,获取行时可能会有速度提升,因为它具有更紧密的耦合性。mysqlnd似乎没有向PHP代码公开任何API,只有其他扩展可以使用。 - Chinoto Vokro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接