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)
但他们不是!
我对像'尝试一次更新多行'这样的建议不感兴趣;)
很可能你已经启用了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)
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |