Cakephp查询大数据库和分页

时间:2015-04-23 15:41:07

标签: cakephp

我正在使用cakephp和Mysql来开发一个商店系统,其中注册我销售的所有产品,系统工作正常,直到我开始进行一些测试,我已经介绍了超过30,000个产品的寄存器,并从那里开始,我无法搜索我的产品,因为我遇到了这个错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)

从我的研究中发现,如果发现这与记忆有关,我可以增加记忆力,但我也意识到这些将是动量解决方案。 我已经看到控制器产品中调用的函数是这样的:

public function search() {
    $this->Product->recursive = 0;
    $this->set('products', $this->paginate());
    $products = $this->Product->find('all');
    $this->set(compact('products'));
}

从此我发现这可能是问题,因为它正在获取所有产品。

所以我需要的帮助是如何改进这一点,这将是最好的方法。在我的研究中,我期望获得的解决方案之一可能是获得此查询,但是时间上取得10,我不知道是否可能。

先谢谢。 PS

2 个答案:

答案 0 :(得分:4)

删除最后两行。

您正在进行分页调用,这是您想要的,但随后将其丢弃并获取所有记录。当你有大量数据时,这是非常昂贵的。

public function search() {
    $this->Product->recursive = 0;
    $this->set('products', $this->paginate());
}

答案 1 :(得分:3)

如果您使用的是CakePHP版本2,这是使用paginator的正确方法,您还可以使用其他内容(如10,20,30等)限制每页数据,以便无法一次加载所有数据

public function search() {
 $this->Paginator->settings = array(
    'limit' => 10,
    'recursive' => 0
 );
 $products = $this->Paginator->paginate('Product');
 $this->set(compact('products'));
}