我有一个PHP脚本,当用户提交一个导致SQL查询的表单时,有时会超过PHP有权使用的内存限制(128M)。具体的代码行如下:$rows = $db->fetchAll($select);
(我使用的是ZF1.12)。
我已经阅读了所有可能阅读的主题,但是我不知道如何跟踪内存使用情况。我知道memory_get_usage(true)
和memory_get_peak_usage(true)
函数允许监视PHP当前使用的内存(但这些给我的值约为13Mb,远远小于128M的限制)。我也试图处理register_shutdown_function()
的致命错误,但我想在致命错误发生之前处理问题。
我也不想通过ini_set()
或.htaccess
或编辑php.ini
文件来增加值。
因此,我的问题是:我如何监控PHP当前使用的内存,并在达到限制之前做我想做的事情?
PS:我和这个用户有基本相同的问题,但我不想捕获致命错误,我想在它发生之前做一些特定的事情
尝试在查询中添加限制,并在循环中分页。如果您不需要对象,请尝试运行"原始查询"而不是使用ORM。
如果你使用循环来获取结果,你可以用已知的函数来查看内存使用情况
我最终捕获了register_shutdown_function()
的致命错误,并显示了一个漂亮的错误页面。
使用更少内存的一种方法是使用fetch()
而不是 fetchAll()
并逐行处理结果。这将减轻负载并使用更少的内存:
更改:$rows = $db->fetchAll($select)
:
while ($row = $db->fetch($select)) {
echo $row; //Whatever you want to do with each row.
}
这个比下面这个更有效,因为你不需要一次获取所有的数据,你每次处理一个结果:
$rows = $db->fetchAll($select)
foreach ($rows as $row) {
echo $row; //Whatever you want to do with each row.
}