0

所以,我有这段代码:

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()与产品控制器的所有关联有关。它有 2 个 belongsTo(属于较小的表)和 1 个 hasOne(有一个大表,20K+ 行)。

hasOne在产品模型中添加了一个关系,这似乎是导致挂起的原因。当我删除这种关系时,URL 会起作用并显示所有项目。但是,hasOne当我这样做时,这种关系不会导致任何错误,例如../products/view/1.

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

4

1 回答 1

1

您可以查看一些内容来开始调试。首先是您的日志。分别检查 SQL 和 PHP 日志中的慢查询和超时错误。

如果您的 Product 模型有很多关联,我建议使用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 应用程序,这听起来可能是问题所在。

于 2012-04-16T20:53:25.413 回答