`

提升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

    标题中的“最简单的方法来安装CakePHP”表明我们将探讨如何以最简便的方式在你的开发环境中设置和安装CakePHP,这是一个非常流行的PHP开发框架。CakePHP以其MVC(模型-视图-控制器)架构模式,丰富的功能和易于学习...

    cakephp 框架书籍 英文版

    - **提升应用性能**:提供了一些建议来优化生产环境下的应用性能。 #### 十二、Tutorials & Examples(教程与示例) - **博客教程**:通过一个完整的博客项目示例,展示了如何使用CakePHP框架构建实际应用。 - **...

    cakephp-1.2 manual

    8. **哈巴狗(CakePHP Bake Tool)**:这是一个内置的代码生成工具,可以快速生成模型、控制器、视图和其他基础代码,大大加快开发速度。 9. **验证(Validation)**:手册会介绍如何在模型中设置数据验证规则,...

    CakePHP 1.2 API 中文文档

    **CakePHP 1.2 API 中文... CakePHP 1.2 API 中文文档覆盖了框架的主要组件、类库和方法,是开发者学习和使用该框架的重要参考资料。通过深入理解和实践这些知识点,开发者能够高效地构建稳定、可维护的PHP Web应用。

    cakephp 框架1.3.11版本

    6. **烤箱**(Bake):这是CakePHP自带的一个工具,可以自动生成模型、控制器、视图等基础代码,加快开发速度。 7. **错误处理与调试**:CakePHP提供了一套完整的错误处理和调试工具,如DebugKit,便于开发者查找和...

    cakephp-2.4.1

    10. **性能优化**:CakePHP提供缓存机制,包括查询缓存、视图缓存和页面碎片缓存,有效提高应用程序的运行速度。 11. **社区与文档**:CakePHP拥有活跃的开发者社区和详尽的官方文档,遇到问题时可以快速找到解决...

    CakePHP PHP MVC框架

    - **Cake中文手册.chm**:这是官方中文文档,包含了详尽的API参考和教程,帮助开发者快速掌握CakePHP的使用方法。 - **访问脚本之家.html**:可能是一个关于CakePHP或其他PHP技术的文章链接,提供更多的学习资源。 -...

    phpmvc框架cakephp

    2. **目录结构**:CakePHP有清晰的目录结构,如APP(应用程序)、VENDOR(第三方库)、WEBROOT(网页资源)等,这有助于保持代码组织有序。 3. **路由系统**: CakePHP的路由机制允许开发者灵活地定义URL模式与控制...

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

    其强大的命令行工具Symfony Console也极大地提升了开发效率。 **CakePHP框架** CakePHP是一个基于MVC(模型-视图-控制器)架构的PHP框架,它强调开发速度和易用性。该框架提供了许多开箱即用的功能,如ActiveRecord...

    CakePHP v2.3.0.zip

    快速开发**:CakePHP v2.3.0引入了“Bake”工具,它是一个命令行接口,能够自动生成模型、控制器、视图等基础代码,大大加快了开发速度。 **4. 支持和社区**:CakePHP拥有活跃的社区和丰富的文档资源,开发者可以...

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

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

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

    在 CakePHP 3.4 中,这种原则体现得尤为明显,它通过清晰地定义应用结构、默认行为等,减少开发者需要编写的代码量,从而提高开发效率。 - **模型层**:负责处理数据和业务逻辑。它提供了一套完整的 ORM(对象关系...

    PHP的框架之CakePHP-CakePHP教程

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

    cakephp框架源码

    通过学习CakePHP源码,开发者不仅可以掌握框架的使用,还能提升PHP编程技能,理解设计模式,以及如何构建高效、可维护的Web应用。 在解压的文件`cakephp-cakephp-3b830a4`中,包含了CakePHP的源代码仓库的一个特定...

    CakePHP路由

    在CakePHP框架中,这一过程同样重要,它允许开发者通过简单的配置来管理URL的映射关系,从而实现更加灵活和可维护的应用架构。 #### CakePHP中的路由机制 CakePHP提供了强大的路由系统,能够帮助开发者快速地设置和...

    cakephp 测试工具 simpletest

    通过编写清晰的断言,模拟用户行为,以及检查结果,SimpleTest可以帮助开发者确保CakePHP应用程序的稳定性和质量。无论你是新手还是经验丰富的开发者,理解并熟练使用SimpleTest都能大大提高你的工作效率。

    cakephp中文手册API

    通过缓存、数据集的批处理、查询优化等手段,CakePHP可以提升应用的性能。它支持多种缓存引擎,如Memcached和Redis。 15. **部署与扩展**: CakePHP遵循最佳实践,使应用程序易于部署和维护。此外,丰富的插件库...

    cakephp分页.docx

    对于使用CakePHP框架的应用程序而言,这一过程被极大地简化了。CakePHP通过内置的`PaginatorComponent`组件提供了强大的分页功能,使得开发人员能够轻松处理大量数据的分页显示问题。 #### 二、`PaginatorComponent...

    cakephp中文手册

    1. **快速开发**:CakePHP 提供了大量的内置功能,如数据库连接管理、ORM(对象关系映射)、表单处理和验证、自动化的脚手架生成等,这大大加快了开发速度。 2. **MVC架构**:按照MVC设计模式,开发者将业务逻辑、...

    CakePHP使用ajax传值

    CakePHP框架中实现Ajax传值是通过AJAX (Asynchronous JavaScript and XML) 技术与后端的CakePHP控制器进行数据交换的一种方式。通常在Web开发中,Ajax用于创建更为动态和响应快速的用户界面。当用户与页面上的元素...

Global site tag (gtag.js) - Google Analytics