繁体   English   中英

使用CakePHP加速速度非常慢

[英]Mamp extremely slow with CakePHP

我有一个来自myapp.dev:port的mamp v2.1.3(不是专业版,所以是最新版本)在本地运行的Cake Application v2.3.1,当我在网站上进行分页时(大约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,发现分页器对两个左联接执行了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表,这两个表在一起会使查询速度降低4000ms。

我在这里的第二个问题是,为什么这两个联接将其减慢这么多? 我进行了一个名为Artists / all的测试视图,其中列出了100位艺术家,在那里所有联接的查询都在40-50ms内完成。

TLDR:

  1. $recursive设置为-1
  2. 使用CakePHP的“可包含行为”仅检索所需的关联数据

代码示例:

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

记住要仔细阅读Containable的文档-它说明了如何将Model设置为$actsAs Containable,如何将递归设置为-1 ...等等。

我建议实际设置public $recursive=-1'public $actsAs =array('Containable'); 两者都在您的AppModel中-这样,所有模型都已设置好,并随时可以与Containable一起使用。 此外,递归值如果高于-1,则不好看,恕我直言-Containable在各个方面都好得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM