CakePHP:$ this-> paginate()和服务器挂起

时间:2012-04-16 18:46:23

标签: php cakephp optimization paginator

所以,我有这段代码:

class ProductsController extends AppController {
var $name = 'Products';
var $paginate = array('limit' => 5);    // sets the number of entries per page  


function index() {      
    $this->Product->recursive = 0;
    // works up to here fine
    $this->set('products', $this->paginate());  // makes the browser hangs
    }
}

当我转到../products/index时,浏览器就会挂起。它试图加载几分钟而不给出任何错误消息,我被迫重启Apache(XAMPP)或等待60秒。问题似乎与$this->paginate()以及与Product controller的所有关联有关。它有2个belongsTo(属于较小的表)和1个hasOne(有一个大表,20K +行)。

我为产品型号添加了hasOne关系,这似乎导致了悬挂。当我删除此关系时,URL将工作并显示所有项目。但是,例如,hasOne时,此../products/view/1关系不会导致任何错误。

有关如何使其易于管理的任何想法吗?

1 个答案:

答案 0 :(得分:1)

您可以通过以下几种方式开始调试。首先是你的日志。分别检查SQL和PHP日志是否存在慢查询和超时错误。

如果您的产品型号有很多关联,我建议您使用ContainableBehavior。实际上,我建议始终在模型上设置$recurisve = -1;并使用Containable来获取关联。它会大大加快你的应用程序。为什么要提取您未在视图中使用的数据?

在app_model中,添加行为:

class AppModel extends Model {

  var $recursive = -1;

  var $actsAs = array('Containable');
}

然后修改查找查询以获取所需的关联数据:

$this->Product->find('all', array(
  'contain' => array
    'Category',
    'Type'
  )
));

类别和类型与产品相关联的位置。这将告诉Cake只需提取相关数据。

然后查看您的查询。使用DebugKit可帮助您分析计时和慢查询。

这些是加快查找速度的基本方法。有很多信息可以优化你的CakePHP应用程序,这听起来可能是问题所在。