使用CakePHP,Mamp非常慢

时间:2013-05-22 11:03:36

标签: php cakephp mamp

我有一个Cake应用程序v2.3.1在mamp v2.1.3本地运行(不是pro,所以这是最新版本)来自myapp.dev:port,当我在网站上进行分页时,我遇到了一些非常慢的响应(大约5秒钟),这是我在控制器中的代码:

public $paginate = array(
        'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
        'limit' => 50,
        'order' => array('Artist.id' => 'desc')
    );

我在AppController.php中使用twitter bootstrap插件作为我的分页https://github.com/slywalker/TwitterBootstrap

public $helpers = array('Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator'));

我尝试将分页的limit设置为1并尝试使用蛋糕自己的分页而不是引导程序,但它仍然非常慢。我必须成为分页的东西,因为我可以访问像myapp.dev:port/artists/view/14532这样的艺术家,并且效果很好所以我认为它与sql查询没有任何关系。

我尝试更改/ etc / hosts文件127.0.0.1 localhost myapp.dev::1 localhost myapp.dev中的名称,但似乎没有任何效果。有任何想法吗?我真的被卡住了。

更新:不提及我的Artist表所具有的hasMany关系感觉有点不好。这是我的艺术家模型:

class Artist extends AppModel {

    public $hasMany = array(
        'ArtistBiography' => array('dependent' => true),
        'ArtistSurname' => array('dependent' => true),
        'ArtistSignature' => array('dependent' => true),
        'ArtistForename' => array('dependent' => true),
        'ArtistMonogram' => array('dependent' => true));
    public $hasOne = array(
        'ArtistActive' => array('dependent' => true));
}

我使用了DebugKit,我发现paginator为两个左连接做了2个不必要的查询,每个左连接都需要大约2000毫秒来执行。如何告诉分页器忽略它?我试过这样的事情来建立一种新的关系:

public $paginate = array(
        'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'),
        'limit' => 50,
        'order' => array('Artist.id' => 'desc'),
        'joins' => array(
                array('table' => 'artist_forenames', 'alias' => 'ArtistForename', 'type' `=>     'inner', 'conditions' => array('Artist.id = ArtistForename.artist_id')),`
                array('table' => 'artist_surnames', 'alias' => 'ArtistSurname', 'type' => 'INNER', 'conditions' => array('Artist.id = ArtistSurname.artist_id'))),
        'recursive' => -1
    );

但我不确定如何使这项工作。我最想要的是加入artist_surnamesartist_fornames并忽略两个名为artist.activesartist_monogram的表格,这两个表格一起减慢了4000毫秒的查询速度。

我的第二个问题是为什么这两个连接减慢了这么多?我做了一个名为artists / all的测试视图,我在那里列出了100位艺术家,并且我在所有连接中的查询都是在40-50ms左右完成的。

1 个答案:

答案 0 :(得分:3)

<强> TLDR:

  1. $recursive设为-1
  2. 使用CakePHP's Containable Behavior仅检索所需的关联数据
  3. 代码示例:

    //wherever you set this variable
    $paginate = array(
        'recursive' => -1,
        'limit' => 50,
        'order' => array('Artist.id' => 'desc'),
        'contain' => array(
            'ArtistSurname',
            'ArtistForName'
        )
    );
    

    请记住查看Containable的文档 - 它解释了如何将模型设置为$actsAs可容纳,将递归设置为-1 ...等等。

    我建议在你的AppModel中实际设置public $recursive=-1'public $actsAs =array('Containable'); - 这样就可以设置所有模型并随时随地使用Containable。此外,任何高于-1的递归都是糟糕的恕我直言 - 包含在各个方面都要好得多。