【发布时间】:2012-10-25 03:05:22
【问题描述】:
我正在使用 php 5.2.5 并从命令行执行脚本。在这个脚本中,我正在处理从 db 获取的数据。要从 db 获取数据,我使用 Zend Adapter。 我注意到调用后内存增加(262144 字节) "fetchAll($sql,$data,Zend_Db::FETCH_ASSOC)"
因此最终导致内存不足。 为了测试,我只是执行了“fetchAll”,甚至没有将它返回的数据存储在任何变量中。但是我仍然看到没有回收的内存增加。
- Zend FetchAll 方法是否存在内存泄漏问题?
- 为什么内存会增加 262144 或 262144 的倍数?
- 内存增加是随机发生的,并非在所有 fetchAll 调用中都发生,为什么会这样?
我已经尝试使用 memory_get_usage() 来确定内存泄漏的原因,但是由于代码很大,因此需要很长时间,有什么方法可以获取内存中所有对象的详细信息,以便我可以更好地调试问题吗?
sql是:-
select b.Id as Id,b.Lang
from groups g
left join table1 b on b.Group_Id = g.Id
left join table2 bs on bs.Id = b.Id
where g.Id = ? and b.Lang = ?
【问题讨论】:
-
如果您还包含 sql 命令,则最好。因为这可能是一个问题(例如,您在不使用限制的情况下连接多个表,以便每一行都与每一行连接)。
-
该 sql 是“从组 g 中选择 b.Id 作为 Id,b.Lang 在 b.Group_Id = g.Id left join table2 bs on bs.Id = b.Id where g.Id = ? 和 b.Lang = ?"。请你能更好地解释一下为什么内存使用会因为sql语句问题而增加。
-
对于泄漏问题本身,我认为那里的答案很好。从我看到的 sql 不会导致一般问题(因为它限制了哪些行与哪一行相关联)。似乎真的是表本身中有太多数据行或内存泄漏。正如你提到的,代码是巨大的。您是否在它们过时后取消设置存储输入的变量? (否则他们仍然保留内存)
-
我假设您希望取消设置的变量是 $result 在这一行 "$result = fetchAll($sql,$data,Zend_Db::FETCH_ASSOC);"我没有取消设置变量,因为变量在方法的范围内,所以我期望它不应该保留在内存中?即使在方法执行完成之后,是否有可能存在方法范围内的变量?请你也可以分享任何关于内存泄漏问题的好链接。
-
你可以用
$this->fetchRow($where);代替fetchAll()
标签: php mysql zend-framework memory fetchall