Fra*_*rth 10 php doctrine memory-management
Doctrine似乎占用了超过4MB的RAM来执行一个简单的查询:
print memory_get_peak_usage()." <br>\n";
$q = Doctrine_Query::create()
->from('Directories d')
->where('d.DIRECTORY_ID = ?', 5);
$dir = $q->fetchOne();
print $dir['name']." ".$dir['description']."<br>\n";
print memory_get_peak_usage()." <br>\n";
/*************** OUTPUT: **************************
6393616
testname testdescription
10999648
/***************************************************/
Run Code Online (Sandbox Code Playgroud)
这是在一个测试数据库中,其中包含非常少的数据 - 我查询的项目不包含除此处显示的数据之外的任何数据.
我的系统设置方式是否有可能出现问题,或者是Doctrine的标准内存使用情况?
从我所看到的,你的代码似乎没有错...
作为测试,我已经设置了一个快速示例,其中包含一个非常简单的表(只有四个字段).
这是相关代码:
var_dump(number_format(memory_get_peak_usage()));
$test = Doctrine::getTable('Test')->find(1);
var_dump(number_format(memory_get_peak_usage()));
Run Code Online (Sandbox Code Playgroud)
这样做时,我有这样的输出:
string '1,316,088' (length=9)
string '2,148,760' (length=9)
Run Code Online (Sandbox Code Playgroud)
考虑到桌子非常简单,而且我只取一条线,对我来说似乎"很多" - 但这与你得到的结果非常一致,并且与我在其他项目中看到的一致:-(
如果您只需要显示数据,而不是使用它(即更新/删除/ ...),解决方案可能不是获取复杂对象,而只是一个简单的数组:
$test = Doctrine::getTable('Test')->find(1, Doctrine::HYDRATE_ARRAY);
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,它并没有太大的区别,实际上:-(:
string '1,316,424' (length=9)
string '2,107,128' (length=9)
Run Code Online (Sandbox Code Playgroud)
只有40 KB的差异 - 好吧,更大的物体/更多的线条,它可能仍然是一个好主意...
在Doctrine手册中,有一个名为Improved Performance的页面; 也许它可以帮助你,特别是对于这些部分:
哦,顺便说一下:我在PHP 5.3.0上做过这个测试; 也许这会对使用的内存量产生影响......
我同意romanb的回答 - 使用大型库/框架时,使用OpCode缓存是必须的.
与OpCode缓存相关的示例
我最近采用了Zend Framework的Doctrine用法并对内存使用感到好奇 - 所以和OP一样,我创建了一个使用类似OPs测试标准的方法,并将其作为一个整体测试运行,以查看ZF + Doctrine的峰值内存使用量是多少是.
我得到了以下结果:
没有APC的结果:
10.25 megabytes
RV David
16.5 megabytes
Run Code Online (Sandbox Code Playgroud)
APC的结果:
3 megabytes
RV David
4.25 megabytes
Run Code Online (Sandbox Code Playgroud)
操作码缓存具有非常显着的差异.