如何在zend中清理/释放数据库查询内存?

Mar*_* J. 2 php database memory-management zend-framework

在执行这个简单的代码(对于MySQL数据库)之后,我为每个循环迭代减少了1kB的内存,所以在第1000次迭代后我使用了大约1MB的内存.

现在,如果我必须循环一个长时间运行的脚本(大约1 000 000次迭代),我将很快失去记忆

$_db = Zend_Db_Table::getDefaultAdapter();

$start_memory = memory_get_usage();

for ($i=0; $i<1000; $i++) {
    $update_query = "UPDATE table SET field='value'";
    $_db->query($update_query);
}

echo 'memory used: '.(memory_get_usage()-$start_memory);
Run Code Online (Sandbox Code Playgroud)

有没有办法释放数据库查询使用的内存?

我试图将更新查询放在一个函数中,所以在离开函数之后,应该自动释放这个函数使用的资源:

function update($_db) {
  $sql = "UPDATE table SET field='value'";
  $_db->query($sql);
}
...
for ($i=0; $i<1000; $i++) {
    update($_db);
}
Run Code Online (Sandbox Code Playgroud)

但他们不是!

我对像'尝试一次更新多行'这样的建议不感兴趣;)

Mic*_*Osl 6

很可能你已经启用了Zend_Db_Profiler.

数据库探查器存储每个执行的查询,这对于调试和优化非常有用,但如果执行大量查询,则会导致相当快的内存耗尽.

在您给出的示例中,禁用探查器应该可以解决问题:

$_db = Zend_Db_Table::getDefaultAdapter();
$_db->getProfiler()->setEnabled(false);

$start_memory = memory_get_usage();

for ($i=0; $i<1000; $i++) {
    $update_query = "UPDATE table SET field='value'";
    $_db->query($update_query);
}

echo 'memory used: '.(memory_get_usage()-$start_memory);
Run Code Online (Sandbox Code Playgroud)