3

我有一个 cakephp 应用程序 2.4,但 Paginator 组件有问题。首先,它不是数据库,它肯定是解析查询结果的执行。我安装了 DebugKit,可以看到我对分页数据的 mysql 查询需要整整 2 毫秒。该表有 250 万条消息记录和 500,000 个用户。显然,适当的索引已经到位。但是,控制器动作需要 6167.82 毫秒。所以,这是我的控制器操作:

$this->Paginator->settings = array(
  'Message' => array(
    'fields' => array(
      'Recipient.username',
      'Recipient.profile_photo',
      'Recipient.id',
      'Message.*'
    ),
    'joins' => array(array(
      'table' => 'users',
      'alias' => 'Recipient',
      'type' => 'LEFT',
      'conditions' => array(
        'Recipient.id = `Message`.`recipient_id`'
      )
    )),
      'conditions' => array( 
      'Message.sender_id' => $this->Auth->user('id'), 
      'Message.deleted_by_sender' => '0' 
    ), 
    'limit' => 10, 
    'order' => 'Message.id DESC', 
    'recursive' => -1 
  )
);
$sents = $this->Paginator->paginate( 'Message' );
$this->set( 'sents', $sents );
$this->view = 'index';

我已经谷歌了这个并搜索了堆栈溢出。大多数响应是针对糟糕的 mysql 优化,这不是我的情况。另一半的回答表明可以控制。所以,我尝试了可包含的。使用 contains 实际上更慢,因为它试图从用户字段中获取更多数据,而不仅仅是用户名、照片和 ID。然后,当 cake 从查询结果构建数组时,由于我假设有额外的用户数据,它在可包含的情况下执行速度慢了近 500 毫秒。

我现在要深入研究 Cake Paginator 组件,看看为什么构建响应需要这么长时间。我希望有人能打败我,并有一个很好的解决方案来帮助加快速度。

我的 Web 服务器正在运行 ubuntu 12.04,带有 3gb ram、apache 和 mod_php,安装了 apc 并为模型和核心缓存工作。数据库位于单独的服务器上。我还有一个 redis 服务器保存其他用户数据和蛋糕会话数据。这里有足够的能力从包含大约十二行的 mysql 查询中解析 10 条记录。

编辑:答案

正如 Ilie Pandia 首先建议的那样,发生了其他事情,例如回调,这正在减慢分页速度。这实际上与分页组件无关。Recipient 模型的行为在 3rd 方服务的设置回调中加载了 sdk。该服务需要几秒钟才能响应。这发生在加载查询中的linkedModel 以过滤结果时。希望其他寻找 cake 可能表现不佳的原因的人也会查看应用程序和插件中模型的回调。

4

2 回答 2

0

我认为这根本没有理由运行缓慢。

所以这表明安装了一些回调(在模型或控制器中)进行额外的处理并增加动作时间。

那是假设控制器中除了您写的内容之外没有其他内容。

您实际上可以测量分页调用本身的时间,我想您会发现它非常快。所以瓶颈在代码的其他地方。

PS:您也可以尝试禁用 DebugKit 一段时间。对于某些特定情况,自省可能需要很长时间。

于 2014-01-28T19:03:43.863 回答
-1

为您的应用程序安装 DebugKit。

并检查哪个查询花费了太多时间。从那里,您应该能够跟踪瓶颈。

于 2014-01-29T06:31:29.563 回答