Mysql CakePHP的内存分配问题

Mysql CakePHP的内存分配问题,mysql,cakephp,memory,Mysql,Cakephp,Memory,我仍然对蛋糕的记忆用法有问题。我读了很多威胁,尝试了1000种方法,但没有任何真正的帮助。 我使用CakePHP2.4.x。使用MySQLdB。我编写了一个API来从数据库中选择日志数据。我做了一个测试来解释是什么让我如此困惑。我有一个select,它返回1400行11列。我的一般内存使用量(使用内存获取使用量)约为4MB。 在我选择之后: $condition = array('conditions'=> array( 'LogBackend.created_at betwe

我仍然对蛋糕的记忆用法有问题。我读了很多威胁,尝试了1000种方法,但没有任何真正的帮助。 我使用CakePHP2.4.x。使用MySQLdB。我编写了一个API来从数据库中选择日志数据。我做了一个测试来解释是什么让我如此困惑。我有一个select,它返回1400行11列。我的一般内存使用量(使用内存获取使用量)约为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空间刚刚用完。 有人能告诉我为什么会使用这种荒谬的内存吗


致以最诚挚的问候

只需使用paginate,并将数据分块处理即可。蛋糕是面向一个视图的20行左右的块。但我们通常希望生成基于数百万行的报告。CakePhp有一个名为paginate的函数,它可以被欺骗,从而非常有效地执行mysql限制1000010000。我通过谷歌搜索发现了这些黑客行为,CakePHP1.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循环将每次覆盖$行,重新使用该核心内存。因此,挑战在于找到一种聪明的方法来提取数据,或者在循环过程中编写一个新表,以便在下一次优化过程中使用。由于模型处理开销,Cakephp上的执行速度仍然较慢,因此如果有许多不需要的列,请使用paginate['fields']仅处理所需的字段。字段和列是一样的


PHP在哲学上与Apache紧密相连,因此它并不适用于这种情况。它的目的是在30秒或更短的时间内获得结果,并呈现一个网页。这不仅仅是蛋糕的错。Python和Ruby可能更好,即使是Perl。但是,当你不得不筛选工具来格式化html格式时,你会像婴儿一样哭泣。

你使用的是可容纳的行为吗?您是否在某个地方设置了
$recursive
?@cernunnos我同意,这当然取决于具体目的,可以以不同的方式实现。然而,国际海事组织在这方面并非没有责任。CakePHP模型总是以数组的形式返回结果,从而将整个记录集加载到内存中。例如,如果OP想要实现导出功能,那么通过标准的CakePHP模型是不可能的。创建使用的自定义模型/数据源可能是一个解决方案。@user2140111抱歉,我现在看到我的评论中缺少一个单词;我的意思是说CakePHP并非没有责任。始终在内存中加载整个记录集是CakePHP的一个问题(限制),而不是您的代码。如果用户的查询返回大型记录集,您可能需要编写一些代码,直接从数据库检索数据(使用并直接将其输出到浏览器(可能是“块”,使用)。现在我已经使用mysql_connect()创建了自己的mysql连接。比CakePHP快200倍。Thx对于您的提示@Thajeztah要小心使用mysql_*函数,它们不再被维护,将被弃用。最好使用PDO