如何在Zend的清理/免费的数据库查询内存?(how to cleanup / free datab

2019-09-17 16:29发布

执行这个简单的代码(MySQL数据库)之后,我得到的内存少每次循环迭代1KB,所以以后1000'th迭代我有关于使用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);

是否有一个释放的数据库查询使用的内存呢?

我试图把更新查询的功能,所以在离开这个功能使用的功能范围的资源后,应automaticaly释放:

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

但他们都没有!

我像“尝试更新一气呵成复式行”建议不感兴趣;)

Answer 1:

最可能的是你有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);


Answer 2:

当同一个查询多次执行以节省内存的最佳方法是实现准备好的语句 。 您的适配器将使用准备好的语句,但由于您呼叫的循环中的query()方法,它变得准备每一次。 移动循环的那个以外:

$_db = Zend_Db_Table::getDefaultAdapter();
$_stm = $_db->prepare("UPDATE table SET field='?'");

for ($i=0; $i<1000; $i++) {
    $_stm->execute(array($fieldValue));
} 


文章来源: how to cleanup / free database query memory in zend?