CakePHP的内存分配问题

时间:2013-04-18 14:38:38

标签: mysql cakephp memory

我仍然对Cake的mempry使用有问题。我读了很多威胁,尝试了1000件事,但没有什么真正帮助。 我使用CakePHP 2.4.x.使用MySQLdB。我写了一个API来从数据库中选择日志数据。我做了一个测试来解释让我困惑的是什么。我有一个选择,返回1400行,11列。我的一般内存使用量(使用memory_get_usage)大约是4MB。 在我选择之后:

$condition = array('conditions'=> array(


    'LogBackend.created_at between ? AND ?' => array(
                                            $this->params['url']['from'],$this->params['url']['to']
                                       )));

    $this->data = $this->LogBackend->find('all', $condition).

我的内存使用量只会超过9MB。根本没有返回或任何与数据有关的工作。只是选择。好吧9MB并不是那么多,但如果我选择更多,就像它应该可以绕大约100k行。我的256MB空间不足。 有人能告诉我这种荒谬的内存使用的原因吗?

最好的问候

1 个答案:

答案 0 :(得分:0)

只需使用paginate,然后以块的形式处理数据。蛋糕面向大约20行左右的视图。但通常我们希望根据数百万行生成报告。 CakePhp有一个名为paginate的函数,它可以被骗到非常高效地运行mysql LIMIT 100000,1000。我发现这些黑客攻击相当激烈,Cakephp 1.3的语法略有不同,如果没有人在Cake 3上发布信息,并且它发生了变化,我可能会在某一天回来发布。

// cakephp 2.4.1
$condition = array('conditions'=>
array('LogBackend.created_at between ? AND ?' =>
array($this->params['url']['from'],$this->params['url']['to'])));

$this->paginate['conditions'] = $conditions['conditions'];
$this->paginate['limit'] = 1000;
// could also use ['fields'] = array('filed1', 'field2'); to limit memory

/******* here is where we trick paginate to iter in the ctrlr *****/
$this->request->params['named']['page']=1;
$this->request->params['paging']['ModelName']['nextPage'] = true;
// get chunks
while ($this->request->params['paging']['ModelName']['nextPage']) {
    $Rows = $this->paginate("ModelName");
    // boil down this chunk of data 
    $this->request->params['named']['page']+=1;
}

将数百万行传回视图是没有意义的。 while循环每次都会覆盖$ Rows,重新使用该核心内存。因此,面临的挑战是找到一种巧妙的方式来提取数据,或者在循环过程中编写一个新表,以便在下一次改进过程中使用。由于模型处理开销,Cakephp上的执行速度仍然较慢,因此如果有很多不需要的列,请使用paginate [' fields']仅处理您需要的字段。 Fields与列相同。

PHP在哲学上与Apache完全联系在一起,所以它实际上并不适合这种事情。这意味着在30秒或更短的时间内获得结果并呈现网页。它不仅仅是蛋糕的责任。 Python和Ruby可能会更好,甚至Perl。但是当你必须筛选工具来格式化html时,你会像个婴儿一样哭泣。