`

提升CakePHP网页应用速度的八大方法

    博客分类:
  • PHP
 
阅读更多
http://www.21haolou.com/articles/show/46
引言

CakePHP 有些慢已经不是什么公开的秘密了。但不为众人所知的是这是一个大大的阴谋。而我会因揭露这个阴谋惹上不少麻烦。不过我愿意冒险一搏。我手头有大量的记录和文档线索表明CakePHP开发团队的成员手头持有戴尔,IBM,思科以及其他服务器厂商的公司股票。想必你已经听说过这类的措辞像“硬件白菜价,而程序员太金贵了。"Cake的开发团队从中嗅到了商机,他们便制作出了这款易于上手和开发,但是却跑得很慢的框架来。他们希望你在硬件方面多砸点钱来。这点子太有才了吧,对不?好了,闲扯就此结束。作为一个CakePHP的开发者,每当你学会使用本文中的一个技巧,套在你脖子上的这枷锁就少了一层。

注意:

本文认为你已经在使用ContainableBehavior并且已经对你的SQL查询进行优化和索引了
我使用ab(ApacheBench是Apache自带的HTTP性能测试工具)对所有改动后的性能进行了测试,并与基准值做了对比。这里的基准值是 debug级别为0时的简单应用程序的性能。我并没有把实际基准数字贴出来。因为这类数字会因应用程序和机器性能而波动。不过我将以百分比的形式将大概的 性能提升数据附在了文中。
另外,你想看看我测试所用的应用程序内容?门儿都没有。
一、 将debug级别设置为0

这技巧很没技术含量,是吧?在Google小组中有 大量的帖子在扯其他方法。想都不用想,先把你CakePHP应用程序的debug级别设置为0在说。

将此值设0和不设0是有区别的,原因就在Cake引 擎生成两部分缓存内容

第一部分是/tmp /cache/models中的缓存内容。在这里,你会看到每个模型都有一个对应的文件,这些文件中包含的是数据库的表模式(table schema)。想必你已经看到过数据库查询记录中包含一些”DESC table;” 这类的查询内容,这些缓存文件就是做着这个用的。当debug级别设置为0时,这些数据库查询就不会进行。

第二部分的缓存是在/tmp /cache/persistent中。当你运行你的Cake网页应用时,CakePHP会用到其中几种不同的文件。而通常拖慢CakePHP运行速度最 厉害的当属cake_core_file_map。这个文件保存了到各个不同类的路径信息。为了创建这个文件,CakePHP会做一个必须但是也是非常耗 费时间的搜索,以便在你的目录结构中找到对应的文件。

那么,debug级别是0和debug级别大于0时有什么区别呢?呵,他们两者之间相差的是2.73517104年。当debug级别大于0时,这些缓存文件的时间周期是10秒钟。而把debug级别设置为0时,这些文件的缓存时间周期则是999 天。(译者:这就是前面 2.73517104年差距的来历)

实 际上我这里有这样一个疑问:既然这种事情是非常“脑残”的技巧,那么连这种“脑残”的技巧都不采用的人是不是比“脑残”好“脑残”呢?如果连“脑残”的人 都能弄明白这种技巧,那么那些不会的人的脑子是不是被狗吃了。既然这些人的脑子被狗吃了,那么我对这钟人讲这种技巧岂不是肉包子打狗——有去无回?(译 者:囧)

性能大致提升数字为:80%到100%左右

二、缓存拖慢速度的查询/网络服务请求等等

对于缓存你应用程序中的单个部件而 言,CakePHP的缓存库(cache lib)是一个非常不错的工具。它会处理所有“脏重累的活儿”,比如向缓存引擎中的文件或者内存中写入内容。你所需要做的就是想清楚哪些东西需要缓存。

打个比方说,你有一个已经索引并已经优化了的数据库 查询,但是查询速度还是比较慢。CakePHP的烹饪手册上(link)就提供了一个例子,教你 如何将缓存库应用起来,缓存后,CakePHP就不会对每一个请求都进行这种拖慢速度的数据库查询。

如 果你网站的部分内容是来自其他网络服务的的,比如一个显示最新推文的区域(这个例子并不恰当,因为大多数Twitter挂件都是用JavaScript写 成的,这里读者就将就一下吧。)我们完全没必要对每个发来的请求都调用这个网络服务。只需像上面一样,用缓存功能将其缓存起来即可

性能提升:+0% 到 1000000%,这取决于你的应用程序,以及你所缓存的内容。

三、缓存视图

你可将这视作整个页面的缓存。CakePHP的烹饪手册提供了一些基本的知识(link),因为页面创建依然是通过PHP进 行,所以对于保持页面的部分动态内容还是有些灵活方法的。比如,如果你运营着一个网店时,你可以将产品页面进行缓存,但是页面上还是可以有一块区域来显示 用户的购物车内容,

注意:在CakePHP的烹饪手册中有一个专门的小节来介绍CakePHP支持的各种缓存引擎(link)。 但是,目前的版本(1.2.1.8004),视图缓存所使用的是基于文件的缓存引擎,并不依赖于上面第二部分所说的缓存库( cache library)
速度大致提升:+130% 到 160%

四、HTML网页页面缓存

这个是我们自己的想出来的(link)。 它的原理跟WordPress上的Super Cache插件一样。它会将CakePHP的 页面以HTML文档的形式直接写入网站的根目录。下次,当用户点击这个页面时,你的服务器会直接将这个HTML文件传输给用户,而无需运行PHP。

这种方法也有其明显的局限性,比如缓存的页面上完全 没有动态内容,缓存的内容也不会自动清除。但是,对于RSS的订阅源或者其他像popurls 这种所有浏览者所看到的都是同样内容的页面而言,这种方法就非常不错。

速度提升:~60000%——这绝非夸张,这才是真正的速度提 升

五、 APC

维基百科是这样描述APC的,“它是一种自由的开源框架,它可以优化PHP的中间 代码,并在共享内存中缓存PHP字节码编译器(Bytecode compiler)中的数据和编译好的代码。”(维基百科链接)。总的来说,速度真TMD的 快,并且你还无需改动你的代码。很爽,是吧?

速度提升:+25% 到 100%

六、持久性模型

CakePHP的烹饪手册并没有提及这个技巧,这个 功能的开启很简单,你只需在你的控制器(或者父控制器中)中添加如下属性即可

var $persistModel = true; 

在页面刷新后,你会注意到 /tmp/cache/persistent 目录下会出现两个新的文件,它对应控制器所包含的每个模型。一个文件是模型的缓存,另一个缓存的是类注册器(ClassRegistry)中的对象。跟上 面所提到的视图的缓存一样,这种缓存只会保存在文件系统中。

速度提升:+0%到200%

这种方法效果怎么样取决于你的应用程序。如果你的控制器只有一个模型,并且并没有与其他任何模型关联,那么你不会看到有多大的速度提升。在我们的测试应用程 序中,它带来的速度提升大约在100%左右。其中测试用的控制器中有一个模型,该模型关联其他三个模型,这些关联的模型又有各自关联的模型。

七、在APC中存储持久性缓存内容

要使用这个,你需要开启APC,将CakePHP的 核心缓存模式设置为APC。在core.php文件中,添加如下代码。

Cache::config('_cake_core_', array('engine' => 'Apc',                                
'duration'=> 3600,                                
'probability'=> 100,                                  
)); 
这会将通常缓存在/tmp/cache/persistent 中的缓存文件(不包括持久性模型)保存到内存中去。

速度提升:~25%

这带来的速度提升很难衡量。我试着启用不带指令缓存 (opcode caching)的APC,以便衡量所带来的速度提升,但是却找不到如何设置。

八、加速反向网址路径的寻找

目前有两种方法可以达到此目的。第一种是Debuggable.com网站上Tim同学在一篇文章中所提及的。Tim的方法只对某种链接类型有效,而且还会破坏反向网址路径的寻找功能,而我的方法使用的是缓存功能(link) (译者:具体内容见这个链接。),CakePHP开发团队的Nate同学也称这种方法非常“高明”(link)

速度提升:~50%

正如这里的所有技巧一样,实际的速度提升取决于你的 应用程序。如果你并不使用大量的自定义网址路径,而且页面的链接也不多,那么这个技巧不会带来多大的速度提升
分享到:
评论

相关推荐

    cakephp分页.docx

    cakephp分页,cakephp框架的分页的方法的文档,是cakephp框架的内容。

    app, CakePHP 3.0应用程序模板.zip

    app, CakePHP 3.0应用程序模板 应用程序框架 用创建应用程序的框架可以在下面找到框架源代码: /cakephp 。安装下载 Composer 或者更新 composer self-update 。运行 php composer.phar create-

    最简单的方法来安装CakePHP

    最简单的方法来安装CakePHP

    cakephp 框架

    cakephp 框架 cakephp 框架 cakephp 框架 cakephp 框架 cakephp 框架

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;...CakePHP的中文资料很少,大部分是英文的,希望对大家有用,谢谢!

    cakephp-containable行为behaviour

    2:cakephp中虽然对模型的操作方法中并没有提供像上面提到的连贯方法 但是cake框架提供了一个containable行为类来更好的完善模型关联中遇到的上述问题 ">1:thinkphp中通过框架提供的连贯操作Model >join ‘other ...

    cakephp php-framework

    There are two main ways to get a fresh copy of CakePHP. You can either download an archive copy (zip/tar.gz/tar.bz2) from the main website, or check out the code from the git repository. To download ...

    PHP框架高级编程-应用Symfony,CakePHP和Zend

    PHP框架高级编程-应用Symfony,CakePHP和Zend.

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;...CakePHP的中文资料很少,大部分是英文的,希望对大家有用,谢谢!

    CakePHP php框架 v3.7.0 beta1.zip

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild页面可以看到当前使用...

    CakePHP php框架 v3.8.5

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild页面可以看到当前使用...

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    CakePHP php框架 v3.7.8.zip

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild页面可以看到当前使用...

    cakephp中acl详解

    cakephp中acl详解

    cakePHP经典官方教程

    cakePHP经典官方教程,含大量实例代码。

    cakephp-1.2 manual

    cakephp-1.2 manual 英文版,离线版。

    Beginning CakePHP:From Novice to Professional

    Lead you from a basic setup of CakePHP to building a couple applications that will highlight CakePHPs functionality and capabilities without delving too deeply into the PHP language, but rather ...

    cakephp 框架书籍 英文版

    cakephp 框架书籍 英文版

    cakephp框架源码

    cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码cakephp框架源码

    cakephp-1.3.21.zip

    cakephp-1.3.21.zip

Global site tag (gtag.js) - Google Analytics