gpt4 book ai didi

php - 使用 mysql_fetch_object 时出现奇怪的 MySQL 错误 "Empty row packet body"(PHP 5.3.3)

转载 作者:可可西里 更新时间:2023-11-01 06:27:26 24 4
gpt4 key购买 nike

当我使用 PHP 从资源(查询)中获取行时,我遇到了一个非常奇怪、毫无意义且完全随机的错误。

我的开发机器是带有 Apache 2.2 的 Windows XP SP3,而 MySQL 在虚拟机上运行,​​使用 ubuntu 10.04,具有 768mb 内存、100GB 硬盘和 4 个逻辑内核(Intel q6600)。然而,这个问题与 Windows 上的 PHP 无关,因为我在数据库机器上运行代码时遇到了同样的错误。

我正在使用 mysql 扩展(不是 mysqlimysqlnd),但环顾四周,我针对与 mysqlnd 相关的错误创建了一个补丁扩展名,所以,我可能应该试试。

主要问题是,当我执行这个查询(一个非常大的查询,有几个派生表和超过 20 个连接)并快速处理结果并且一切顺利时,但是当我的代码花了大约 15/20 秒来处理一组行(我需要从一组以特定方式链接的行构建一个对象,我无法更改它,数据库不是我的,并从该对象制作一些 PDF)一段时间后(随机时间)我收到此错误“空行数据包正文”。

我使用无缓冲查询来减少内存消耗(如果我启用缓冲,我会得到大约 260MB 的已用内存)但这不应该是问题。

最佳答案

我遇到了同样的错误。我用的是 PDO,但基本上应该是一样的东西。

你在 MyISAM 表上操作吗?如果是这样,问题可能与此引擎使用的锁定模型有关:它锁定整个表,读取使用共享锁,写入使用独占锁。

这就是我试图做的事情:读取一个没有缓冲的大结果集,并更新同一个表中的一些行。由于您无法在同一连接持有未缓冲的结果集时发出语句,因此我尝试使用另一个连接进行更新。在第一次更新之前读取一直很顺利,此时脚本停顿了大约一分钟,然后我收到了“空行数据包正文”错误。

你看,当读取无缓冲时,共享锁一直保持到整个结果集被读取或游标被关闭。在此期间,表被共享锁锁定,因此其他连接可以获得表上的共享锁(换句话说,从表中读取),但独占锁(用于写入)将不得不等待。如果这发生在同一个脚本中,就会死锁。

现在,为了防止无限死锁,MySQL会在一段时间后强行释放你的共享锁(IIRC这受table_lock_wait_timeout值的影响),转储你的结果集并允许等待独占锁的写入语句轮到它.

因此,虽然在我的情况下是执行此操作的同一个脚本因此停滞直到超时到期,但也可能是其他一些脚本正在尝试对表执行具有相同效果的写操作,这可能是什么发生在你的案例中。

为我解决问题的方法是将表类型更改为 InnoDB,因为该引擎使用行级锁而不是表级锁。但是,由于您说数据库不是您的,所以这对您来说可能是不可能的。

关于php - 使用 mysql_fetch_object 时出现奇怪的 MySQL 错误 "Empty row packet body"(PHP 5.3.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com