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() [重复]

致命错误:未捕获的错误:调用 /homepages/ 中未定义的函数 mysql_pconnect() [重复]

Jenkins发送的html格式的邮件,无样式,求解

1.12.2