所以,我有这段代码:
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
关系不会导致任何错误。
有关如何使其易于管理的任何想法吗?
答案 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应用程序,这听起来可能是问题所在。