章18 -性能
如果你希望你的网站会吸引人群,性能和优化问题在开发阶段应该是一个主要因素。放心,性能一直是一个主要担忧symfony的核心开发人员。ob娱乐下载
而获得的优势通过加速开发过程导致一些开销,symfony的核心开发人员一直认识到性能需求。ob娱乐下载因此,每一个类和方法一直密切检查和优化尽可能快。的基本开销,你可以通过比较测量时间显示一个“hello, world”消息,没有symfony,是最小的。ob娱乐下载因此,框架是可伸缩的,反应压力测试。最终证明,一些网站和极高的交通(也就是说,网站拥有数以百万计的用户很多server-pressuring Ajax交互)使用symfony和它的性能非常满意。ob娱乐下载检查列表symfony的网站开发wiki (ob娱乐下载http://trac.ob娱乐下载symfony-project.org/wiki/ApplicationsDevelopedWithSymfony)的名字。
当然,高流量的网站往往意味着扩大服务器农场和升级硬件,因为他们认为合适的。如果你没有资源来做这个,或者如果你想要确定框架的全功率总是在你的处置,有一些调整,您可以使用symfony应用程序进一步加快。ob娱乐下载本章列出了一些建议各级性能优化的框架,他们大多是为高级用户。他们中的一些人在前面的章节已经提到了,但你会发现它有用的都在一个地方。
调整服务器
一个优化的应用程序应该依靠优化服务器。你应该知道基本的服务器性能,以确保没有symfony以外的瓶颈。ob娱乐下载这里有一些事情要检查以确保您的服务器不是不必要的缓慢。
有magic_quotes_gpc
转在
在php . ini
减慢一个应用程序,因为它告诉PHP逃避所有报价请求参数,但symfony将系统unescape他们之后,唯一的后果将是一个浪费时间,quotes-escaping问题在一些平台上。ob娱乐下载因此,关闭此设置如果你有访问PHP配置。
最近您使用PHP版本,越多越好。PHP 5.2比PHP 5.1快,PHP 5.1比PHP 5.0快很多。所以一定要升级您的PHP版本受益于最新的性能改进。
使用一个PHP加速器(如APC, XCache,或eAccelerator)几乎是强制性的生产服务器,因为它可以使PHP运行平均快50%,没有权衡。确保您安装的一个加速器扩展PHP的实际速度。
另一方面,确保您禁用任何调试工具,如Xdebug或adp扩展,在生产服务器上。
请注意
你可能会感兴趣到底入侵造成的开销mod_rewrite
扩展:它是微不足道的。当然,加载图像与重写规则比加载图像没有放缓,但经济放缓数量级低于任何PHP语句的执行。
一些开发人ob娱乐下载员喜欢使用symfonysyck
,这是一个YAML解析器打包为一个PHP扩展,作为替代symfony的内部解析器。ob娱乐下载快,但symfony的缓存系统已经最ob娱乐下载小化YAML解析的开销,所以好处是不存在的在生产环境中。你也应该知道syck
还没有完全成熟,它可能会导致错误,当你使用它。然而,如果你感兴趣的话,安装扩展(http://whytheluckystiff.net/syck/),symfoob娱乐下载ny将自动使用它。
提示
当一个服务器是不够的,你还可以添加另一个,并使用负载平衡。只要上传/
目录共享和使用数据库存储会话,一个symfony项目反应无缝地在一个负载均衡体系结构。ob娱乐下载
调整模型
在syob娱乐下载mfony中,模型层的声誉是最慢的部分。如果基准测试显示你要优化这一层,这里有几个可能的改进。
优化驱动集成
初始化模型层(核心推动类)需要一些时间,因为需要加载的几类,构造不同的对象。然而,因为symfony集成的方式推动,这些初始化任务发ob娱乐下载生只有当一个动作需要模型,尽可能晚。推动类将只有当初始化对象的生成模型自动装载。这意味着页面不使用模型不惩罚模型层。
如果你的整个应用程序不需要使用模型的层,也可以节省的初始化sfDatabaseManager
在你的整个层通过切换settings.yml
:
:.settings: use_database:
生成的模型类(在lib /模型/ om /
)已经优化——他们不包含评论,他们受益于半自动的系统。依靠手工半自动的,而不是包括文件意味着装载类仅当它真的是必要的。所以不需要一个模型类,在类自动装载将节省执行时间,而使用的替代方法包括
语句不会。至于评论,他们文档的使用方法,但延长模型文件生成,导致小慢磁盘上的开销。生成的方法名称是非常明确的,评论是默认关闭的。
这两个增强symfony-specific,但你可以通ob娱乐下载过改变两个设置恢复默认的推动你propel.ini
文件,如下:
propel.builder。addIncludes = true #添加包括在生成的类声明#而不是依靠propel.builder半自动的系统。addComments = true #添加注释生成的类
对象的数量限制在水合物
当你使用对等类的一个方法来检索对象,查询通过补水过程(创建和填充对象基于查询的结果的行)。例如,检索的所有行文章
表与推动,你通常做以下:
美元的文章= ArticlePeer::doSelect(新标准());
由此产生的美元的文章
变量是类的一个对象数组文章
。每个对象创建和初始化,这需要时间。这有一个主要的后果:直接数据库查询,相反的速度推动查询返回的结果的数量成正比。这意味着你应该优化模型方法只返回一个给定数量的结果。当你不需要返回的所有结果标准
,你应该限制的setLimit ()
和setOffset ()
方法。例如,如果您只需要一个特定查询的行10到20,细化标准
如清单19所示。
清单19 -限制返回的结果的数量标准
$ c=新标准();$ c- >setOffset(10);/ /抵消返回的第一条记录$ c- >setLimit(10);/ /返回的记录数美元的文章= ArticlePeer::doSelect($ c);
这可以自动通过使用寻呼机。的sfPropelPager
对象自动处理偏移量和推动查询水合物的限制只有一个给定页面所需的对象。指的是寻呼机的文档欧宝官网下载app关于这个类的更多信息。
减少的数量与连接查询
在应用程序开发过程中,你应该留意发布的数据库查询每个请求的数量。web调试工具栏显示的数量为每个页面查询,数据库,点击小图标显示这些查询的SQL代码。如果你看到异常查询的数量不断上升,是时候考虑使用一个连接。
在解释连接方法之前,让我们回顾一下会发生什么当你遍历一个对象数组,使用推动getter检索相关类的详细信息,如清单整场。这个示例假设您的模式描述了一个文章
表的外键作者
表。
清单整场-检索相关类的详细信息在一个循环中
/ /在行动这个美元- >文章= ArticlePeer::doSelect(新标准());/ /数据库查询出具doSelect ()选择的文章。id、文章。标题、文章。author_id,…从文章/ /模板中< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章- >getTitle()? >写的,< ? php回声美元的文章- >getAuthor()- >getName()李? > < / >< ? phpendforeach;? >< / ul >
如果美元的文章
数组包含十个对象,getAuthor ()
方法将被称为十倍,进而执行一个数据库查询每一次它被称为水合类的一个对象作者
,如清单18三。
清单18三-外键getter问题一个数据库查询
/ /模板中美元的文章- >getAuthor()/ /数据库查询出具getAuthor ()选择作者。id、author.name……从作者作者。id = ?/ / ?是article.author_id
所以清单整场的页面需要总共11查询:构建所需的一个数组文章
建立一个对象,加上10查询作者
对象。这是一个很多查询只显示文章和作者的列表。
如果你是使用纯SQL,您将知道如何减少查询的数量只有一个检索列的文章
表和作者
表在同一查询。这正是doSelectJoinAuthor ()
的方法ArticlePeer
类。它比一个简单的问题更复杂的查询doSelect ()
电话,但附加列在结果集允许推动水合物文章
对象和相关作者
对象。清单投中三分球的代码清单整场显示相同的结果,但它只需要一个数据库查询,而不是11因此更快。
清单投中三分球,检索文章和作者的详细信息在同一查询
/ /在行动这个美元- >文章= ArticlePeer::doSelectJoinAuthor(新标准());/ /数据库查询出具doSelectJoinAuthor ()选择的文章。id、文章。标题、文章。author_id,…作者。id、author.name……从文章中,作者在文章。author_id = author.id/ /模板(不变)< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章- >getTitle()? >写的,< ? php回声美元的文章- >getAuthor()- >getName()李? > < / >< ? phpendforeach;? >< / ul >
在返回的结果没有区别doSelect ()
电话和doSelectJoinXXX ()
方法;他们都返回相同的数组对象(类文章的例子)。出现在一个外键getter的区别在于使用这些对象。在的情况下doSelect ()
问题查询,一个对象是水化结果;在的情况下doSelectJoinXXX ()
,外国对象已经存在,不需要查询,这个过程要快得多。如果你知道你需要相关对象,调用doSelectJoinXXX ()
方法来减少数据库查询的数量,提高页面的性能。
的doSelectJoinAuthor ()
方法调用时自动生成的propel-build-model
因为之间的关系文章
和作者
表。文章中如果有其他外键表结构——例如,一个类别表,生成的BaseArticlePeer
类会有其他连接方法,见清单波18比5。
清单波18比5——可用的示例doSelect
一个方法ArticlePeer
类
/ /检索文章对象doSelect()/ /检索文章对象和水合物相关作者对象doSelectJoinAuthor()/ /检索对象和水合物相关类别对象的文章doSelectJoinCategory()/ /检索对象和水合物相关对象除了作者的文章doSelectJoinAllExceptAuthor()/ /的同义词doSelectJoinAll()
对等类也包含连接方法doCount ()
。i18n的类(参见第13章)提供doSelectWithI18n ()
方法,它的行为与连接方法但对i18n的对象。发现在你的模型类可用的连接方法,您应该检查生成的对等类lib /模型/ om /
。如果你不找到您的查询所需的连接方法(例如,没有自动生成的连接方法的多对多关系),您可以构建它自己和扩展模型。
提示
当然,一个doSelectJoinXXX ()
电话比调用有点慢doSelect ()
,所以它只提高了整体性能之后如果你使用水化对象。
避免使用临时数组
使用推动时,对象是已经水分,所以不需要准备一个临时数组的模板。开发人员通常不习惯orm掉入这个陷阱。他们想要准备一个字符串数组或整数,而模板可以直接依赖现有的对象数组。例如,假设一个模板的列表显示所有文章的标题出现在数据库中。不使用面向对象的开发人员可能会编写代码类似于清单后所示。
清单后,准备一个数组的行动是没有用的,如果你已经有一个了
/ /在行动美元的文章= ArticlePeer::doSelect(新标准());美元的标题=数组();foreach(美元的文章作为美元的文章){美元的标题(]=美元的文章- >getTitle();}这个美元- >标题=美元的标题;/ /模板中< ul >< ? phpforeach(美元的标题作为美元的标题):? ><李> < ? php回声美元的标题李? > < / >< ? phpendforeach;? >< / ul >
这段代码是补水的问题是已经做的doSelect ()
调用(这需要时间),使美元的标题
数组是多余的,因为你可以写相同的代码如清单18-7所示。构建时间美元的标题
数组可以获得改善应用程序的性能。
清单18-7——使用一个对象数组免除您创建一个临时数组中
/ /在行动这个美元- >文章= ArticlePeer::doSelect(新标准());/ /模板中< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章- >getTitle()李? > < / >< ? phpendforeach;? >< / ul >
如果你觉得你需要准备一个临时对象的数组,因为一些处理是必要的,这样做的正确方法是创建一个新的方法在你的模型类,直接返回这个数组。例如,如果您需要一个数组的文章标题和评论的数量为每一篇文章,行动和模板应该类似于清单18-8。
清单18-8 -使用一个自定义的方法来准备一个临时数组中
/ /在行动这个美元- >文章= ArticlePeer::getArticleTitlesWithNbComments();/ /模板中< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章(0]? >(< ? php回声美元的文章(1]? >评论)李< / >< ? phpendforeach;? >< / ul >
由你来构建一个快速的处理getArticleTitlesWithNbComments ()
方法在模型中——例如,绕过整个对象-关系映射和数据库抽象层。
绕过ORM
当你不真正需要的对象,但是只有几列各表,如在上一个示例中,您可以在模型中创建特定的方法绕过完全ORM层。你可以用克里奥尔语直接调用数据库,例如,并返回一个定制的数组。清单说明了带队打出了这个想法。
清单——使用直接带队打出了克里奥尔语访问优化模型方法,lib /模型/ ArticlePeer.php
类ArticlePeer扩展BaseArticlePeer{公共静态函数getArticleTitlesWithNbComments(){美元的连接=推动:getConnection();美元的查询=“选择% s作为标题,计数(% s)从% s nb左加入% s % s = % sGROUP % s的;美元的查询=sprintf(美元的查询,ArticlePeer::标题,CommentPeer::ID,ArticlePeer::TABLE_NAME,CommentPeer::TABLE_NAME,ArticlePeer::ID,CommentPeer::ARTICLE_ID,ArticlePeer::ID);美元的声明=美元的连接- >prepareStatement(美元的查询);$ resultset=美元的声明- >executeQuery();美元的结果=数组();而($ resultset- >下一个()){美元的结果(]=数组($ resultset- >getString(“标题”),$ resultset- >getInt(“注”));}返回美元的结果;}}
开始构建这些方法时,您可能会编写一个定制的每个操作的方法,和失去的利益层分离,更不用说你失去数据库独立性。
提示
如果推动不适合你作为一个模型层,考虑使用其他orm之前手工编写查询。例如,检查sfDoctrine
插件接口PhpDoctrine ORM。此外,您可以使用另一个数据库抽象层比克里奥尔语直接访问数据库。PHP 5.1, PDO是与PHP和绑定提供了更快的克里奥尔语的替代品。
加快数据库
有许多特定于数据库的优化技术,可以应用无论你使用symfony。ob娱乐下载本节将简要介绍最常见的数据库优化策略,但需要一个良好的数据库引擎和管理知识得到最出你的模型层。
提示
记住web调试工具栏显示每个查询页面,所花的时间和每一个调整应该监控以确定它是否真的提高了性能。
表查询通常是基于非主键列。提高查询的速度,你应该定义索引在数据库模式。添加一个列索引、添加指数:真正的
列定义属性,如清单18所示。
清单18 - -添加一个列指数配置/ schema.yml
推动:文章:id: author_id:标题:{类型:varchar(100)指数:真正的}
您可以使用选择指数:独特的
语法定义一个唯一的索引,而不是经典的一个。您还可以定义多个列索引schema.yml
(请参考第八章更详细的索引的语法)。你绝对应该考虑这样做,因为它通常是一个好方法来加速一个复杂的查询。
添加一个索引模式之后,你应该做同样的数据库本身,通过发行一个添加索引
查询数据库中直接或通过调用propel-build-all
命令(这将不仅重建表结构,但也抹去所有现有的数据)。
提示
索引会让选择
查询速度快,但插入
,更新
,删除
查询是慢。同时,每查询数据库引擎只使用一个索引,他们推断出每个查询索引用于基于内部启发式。添加一个索引有时是令人失望的性能提升,所以一定要测量的改进。
除非特别说明,每个请求使用一个数据库连接在symfony中,年底和连接关闭请求。ob娱乐下载您可以启用持久数据库连接使用一个数据库连接池,保持开放之间的查询,通过设置持久性:真
在databases.yml
文件,如清单18-11所示。
清单18-11 -使持久数据库连接支持,配置/ databases.yml
刺激:推动:类:sfPropelDatabase参数:持久:真正的dsn: mysql: / /登录:passwd@localhost /博客
这可能会或可能不会提高数据库的整体性能,取决于许多因素。关于这一欧宝官网下载app主题的文档是在互联网上丰富的。确保你基准应用程序性能改变这个设置之前和之后来验证其利益。
侧边栏
mysql的技巧
很多MySQL配置的设置,文件在my . cnf中所做,可能改变数据库的性能。确保你读在线文档(欧宝官网下载apphttp://dev.mysql.com/doc/refman/5.0/en/option-files.html在这个问题上。
MySQL提供的工具之一是慢速查询日志。以上的所有SQL语句long_query_time
秒(这是一个设置可以改变的my.cnf
)是记录在一个文件中,很难以解释,但是mysqldumpslow
命令总结有用的。这是一个很好的工具来检测查询,需要优化。
调整视图
根据你如何设计和实现视图层,你可能会注意到小减速或加速效果。本节描述了选择和权衡。
使用最快的代码片段
如果你不使用缓存系统,你必须意识到一个include_component ()
略低于一个吗include_partial ()
,这本身就是略慢于一个简单的PHP包括
。这是因为symfony实例化一个ob娱乐下载视图包含一个部分和一个类的对象sfComponent
包括组件,共同增加一些小的开销超出的必须包括该文件。
然而,这种开销是无关紧要的,除非你包括很多泛音或组件模板。这可能发生在列表或表,每次你一个电话include_partial ()
辅助内foreach
声明。当你注意到大量的部分或组件夹杂物产生重大影响你的表现,你可能会考虑缓存(见第12章),如果缓存不是一个选项,然后切换到简单包括
语句。
至于插槽和组件槽,表现明显的差异。设置所需的处理时间,包括槽可以忽略不计,它相当于一个变量实例化。但组件槽依赖视图配置,它们需要几个对象发起工作。然而,组件槽可以独立于缓存调用模板,而槽总是缓存内的模板,包括他们。
加快路由过程
第九章中解释,每次调用链接辅助模板要求路由系统过程中内部到外部URI URL。这是通过URI之间找到一个匹配的模式routing.yml
文件。ob娱乐下载Symfony它很简单:它试图匹配第一个规则与给定的URI,如果它不工作,它尝试用以下,等等。因为每个测试涉及到正则表达式,这是相当耗费时间。
有一个简单的解决方案:使用规则名称而不是几个模块/行动。这将告诉symfony使用哪一ob娱乐下载个规则,路由系统不会浪费时间试图匹配所有先前的规则。
具体而言,考虑下面的路由规则中定义routing.yml
文件:
article_by_id: url: / /条id参数:{模块:文章中,行动:阅读}
然后代替输出超链接:
< ? php回声link_to(“我的文章”,“文章/读? id =”。美元的文章- >getId())? >
您应该使用最快的版本:
< ? php回声link_to(“我的文章”,“@article_by_id id = ?”。美元的文章- >getId())? >
开始明显的区别,当一个页面包含了一个几十个路由超链接。
跳过的模板
通常,一个响应是由一组的标题和内容。但有些反应不需要的内容。例如,一些Ajax交互只需要几件来自服务器的数据为了养活一个JavaScript程序来更新页面的不同部分。这种简短的回应,一组头单独是更快的传播。正如在第11章所讨论的,一个动作只能返回一个JSON头。从第11章清单奖杯得主再现了一个例子。
清单的奖杯得主——示例操作返回一个JSON头
公共函数executeRefresh(){输出美元={“标题”:“我的基本字母”,“名字”:“布朗”}”;这个美元- >getResponse()- >setHttpHeader(“X-JSON”,“(”。输出美元。“)”);返回sfView::HEADER_ONLY;}
跳过这个模板和布局,和一次可以发送的响应。因为它只包含头文件,更轻量级的,需要更少的时间传送给用户。
第六章解释的另一种方式跳过模板通过返回内容文本直接从行动。这打破了MVC分离,但它可以大大增加一个行动的响应能力。检查清单18-13为例。
清单18-13——行动直接返回内容文本示例
公共函数executeFastAction(){返回这个美元- >renderText(“< html > <身体>你好,世界! < /身体> < / html >”);}
限制默认的助手
标准的助手组(部分
,缓存
,形式
为每个请求加载)。如果你确信你不会使用其中的一些,从列表中删除一个辅助集团标准的将为您解析的辅助文件。尤其是形式辅助集团虽然包含在默认情况下,是很重和减缓页面没有形式仅仅因为它的大小。所以它可能是一个好主意来编辑standard_helpers
设置在settings.yml
文件删除:
:.settings: standard_helpers:部分、缓存删除#形式
是你必须声明的权衡形式
每个模板辅助小组使用它use_helper(形式)
。
压缩响应
ob娱乐下载Symfony压缩响应之前发送给用户。这个功能是基于PHP zlib模块。你可以节省CPU时间为每个请求它才会安静下来settings.yml
文件:
:.settings:压缩
请注意,将平衡CPU增益带宽损失,所以性能不会增加所有配置变化。
提示
如果你关闭zip压缩在PHP中,你可以使它在服务器级。Apache有一个压缩自己的扩展。
调整缓存
第十二章已经描述了如何响应的缓存部分或全部。响应缓存导致的一个主要性能改进,它应该是你的第一个优化的考虑。如果你想充分利用缓存系统,深入阅读,本节揭示你可能没有想到的一些小技巧。
清算的选择性部分缓存
在应用程序开发过程中,你必须在各种情况下清除缓存:
- 当您创建一个新类:添加一个类一个半自动的目录(项目之一
lib /
文件夹)并不足以symfony自动找到它。ob娱乐下载你必须清楚半自动的配置缓存,以便symfony再次浏览的所有目录ob娱乐下载autoload.yml
文件和引用的位置——包括新的autoloadable类。李< / > - 当你改变生产的配置:配置在生产中只在第一个请求解析。进一步的请求使用缓存的版本。所以在生产环境中配置的改变(或任何环境中
SF_DEBUG
是关闭的)不生效,直到您清除缓存文件的版本。李< / > - 当你修改模板的环境中,模板缓存启用:有效的缓存模板总是用来代替现有的模板在生产中,所以一个模板更改被忽略,直到模板缓存清除或过时了。李< / >
- 当你更新的应用程序
同步
命令:这种情况下通常涵盖了前三的修改。李< / >< / ul >清算整个缓存的问题是,下一个请求需要很长时间的过程,因为需要重新生成缓存的配置。此外,模板不修改也会从缓存中清除,失去以前的请求。
这意味着它是一个好主意,只有真的需要重新生成缓存文件。使用的选项
clear-cache
任务定义的一个子集清除缓存文件,如清单18-14所示。清单18-14 -结算只选择部分缓存
/ /清楚只有myapp的缓存应用程序>清除缓存后myapp / /清楚只有myapp的HTML缓存应ob娱乐下载用程序>清除缓存后myapp模板/ /清楚只有myapp的配置缓存应用程序>清除缓存后myapp配置
你也可以手动删除文件
缓存/
目录,或清除模板缓存文件选择性的行动缓存管理器- >删除()
第十二章中描述的方法,如。所有这些技术将最小化的负面的性能影响前面列出的任何变化。
提示
当你升级symfony,缓存会自动ob娱乐下载清除,没有人工干预(如果你设置
check_ob娱乐下载symfony_version
参数真正的
在settings.yml
)。生成缓存页面
当你部署一个新应用程序来生产,模板缓存是空的。你必须等待用户访问这个页面的页面放在缓存中。在关键的部署,页面处理的开销是不可接受的,必须尽快可用缓存的好处第一个请求。
解决方案是自动浏览应用程序的页面的登台环境(配置类似于一个生产)生成的模板缓存,然后缓存的应用程序转移到生产。
自动浏览页面,一种选择是创建一个shell脚本,通过外部url的列表和一个浏览器(比如curl)。但是有一个更好更快的解决方案:一个symfony批量使用ob娱乐下载
sfBrowser
对象,已经第15章中讨论。这是一个用PHP编写的内部浏览器(和使用sfTestBrowser
功能测试)。这需要外部URL,并返回一个响应,但有趣的是,它触发了模板缓存就像一个普通的浏览器。因为它只有一次初始化symfony和不通过HTob娱乐下载TP传输层,该方法快得多。清单18-15显示了一个示例批处理脚本用于生成模板缓存文件的登台环境。通过调用启动它
php批/ generate_cache.php
。清单18-15 -生成模板缓存,
批/ generate_cache.php
< ? php定义(“SF_ROOT_DIR”,realpath(目录名(__FILE__)。“/ . .”));定义(“SF_APP”,“myapp”);定义(“SF_ENVIRONMENT”,“暂存”);定义(“SF_DEBUG”,假);require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR。“应用程序”.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR。“配置”.DIRECTORY_SEPARATOR。“config . php”);/ /数组的url浏览美元的uri=数组(“/ foo /指数”,' / foo / bar /身份证/ 1 ',《/ foo / bar /身份证/ 2》,……);b美元=新sfBrowser();foreach(美元的uri作为美元的uri){b美元- >得到(美元的uri);}
使用一个数据库存储系统缓存
在symfony的默认存储系统模板缓存文件系统:HTML片段或序列化的对象存储在响应ob娱乐下载
缓存/
一个项目的目录。ob娱乐下载Symfony提出了另一种方式来存储缓存:SQLite数据库。这样一个数据库是一个简单的PHP文件,本地知道如何查询非常有效。告诉symfonob娱乐下载y使用SQLite存储,而不是文件系统存储的模板缓存,打开
factories.yml
文件和编辑view_cache
条目如下:view_cache:类:sfSQLiteCache参数:数据库:% SF_TEMPLATE_CACHE_DIR % / cache.db
使用SQLite存储模板缓存的好处是快读和写操作时缓存元素的数量是很重要的。如果您的应用程序使得大量使用缓存,缓存文件的模板最终分散在深文件结构;在这种情况下,切换到SQLite存储将会增加性能。此外,清理缓存文件系统存储可能需要很多文件从磁盘中删除;这个操作可能会持续几秒钟,您的应用程序不可用。SQLite存储系统,缓存清理过程的结果在一个单一的文件操作:删除的SQLite数据库文件。无论当前存储的缓存元素数量,操作是瞬时的。
绕过Symfonyob娱乐下载
加速symfony也许最好的方法就是完全绕过它。ob娱乐下载这是仅仅部分开玩笑地说。有些页面不改变,不需要再加工的框架在每个请求。这里的模板缓存已经加速交付这样的页面,但它仍然依赖于symfony。ob娱乐下载
第12章中描述的技巧让你绕过symfony完全对某些页面。ob娱乐下载第一个涉及到使用HTTP 1.1头问代理和客户端浏览器缓存页面,这样他们就不会再请求下一个页面是需要时间的。第二个是超级快速缓存(自动化
sfSuperCachePlugin
插件),包括存储的反应的一个副本web /
目录和修改重写规则,Apache首先寻找一个将请求交给symfony之前缓存版本。ob娱乐下载这些方法都是很有效的,即使他们只适用于静态页面,他们将处理这些页面从symfony的负担,和服务器将被完全可用来处理复杂的请求。ob娱乐下载
缓存一个函数调用的结果
如果一个函数不依赖于上下文敏感的值和随机性,使用相同的参数来调用两次应该返回相同的结果。这意味着第二个电话很可能避免如果结果第一次被存储。这正是
sfFunctionCache
类。这个类有叫()
方法,它预计可调用和一组参数。调用这个方法时,将创建一个md5散列的所有参数和看起来缓存目录的文件命名这个散列。如果找到这样一个文件,函数返回结果存储在文件中。如果不是,sfFunctionCache执行函数,将结果存储在缓存中,并返回它。所以第二执行清单18-16将比第一个快。清单18-16 -缓存一个函数的结果
function_cache_dir美元= sfConfig::得到(“sf_cache_dir”)。/函数的;fc美元=新sfFunctionCache(function_cache_dir美元);result1美元=fc美元- >调用(“因为”,M_PI);result2美元=fc美元- >调用(“preg_replace”,' /\ s\ s+ / ',' ',输入美元);
的
sfFunctionCache
构造函数将一个绝对目录路径作为参数(目录必须存在对象实例化之前)。的第一个参数叫()
必须是一个可调用的方法,所以它可以是一个函数的名字,一个数组类的名称和静态方法的名字,或一个数组对象的名称和公共方法名称。至于其他的参数叫()
方法,您可以包含多达你需要——他们都是交给可调用的。这个对象是cpu密集型功能特别有用,因为文件I / O开销超过所需的时间来处理一个简单的函数。它依赖于
sfFileCache
类,它是使用的组件还symfony模板缓存引擎。ob娱乐下载更多细节请查阅API文档。欧宝官网下载app谨慎
的
clear-cache
任务的内容只擦除缓存/
文件。如果缓存存储函数的其他地方,它不会自动清除时通过命令行清除缓存。缓存服务器中的数据
PHP加速器提供特殊功能将数据存储在内存中,这样您就可以在请求中使用它。问题是他们都有一个不同的语法,并且每个都有自己的特定的方式执行这一任务。ob娱乐下载Symfony提供了一个类
sfProcessCache
抽象,所有这些差异和与你使用的是哪种加速器。在清单18-17看到它的语法。清单18-17 -语法的
sfProcessCache
方法/ /存储过程中的数据缓存sfProcessCache::集(美元的名字,美元的价值,美元的一生);/ /获取数据美元的价值= sfProcessCache::得到(美元的名字);/ /检查过程中存在的数据缓存value_exists美元= sfProcessCache::有(美元的名字);/ /清除缓存的过程sfProcessCache::清晰的();
的
设置()
方法返回假
如果缓存不工作。可以是任何缓存的值(字符串、数组、对象);的sfProcessCache
类将处理序列化。的get ()
方法返回零
如果在缓存中不存在所需的变量。的方法
sfProcessCache
分类工作即使没有安装加速器。因此,没有风险试图检索数据从缓存的过程,只要你提供一个回退值。例如,清单18 18显示了如何检索过程中配置设置缓存。清单18 18 -安全使用过程缓存
如果(sfProcessCache::有(“myapp_parameters”)){美元的参数= sfProcessCache::得到(“myapp_parameters”);}其他的{美元的参数= retrieve_parameters();}
提示
如果你想更进一步到内存缓存,确保你看一下PHP memcache扩展。它可以帮助减少数据库负载均衡负载应用程序,和PHP 5提供了一个面向对象的接口(http://www.php.net/memcache/)。
未使用的功能才会安静下来
默认的symfony的配ob娱乐下载置激活一个web应用程序的最普遍的特征。然而,如果你不需要他们,你应该禁用他们节省时间初始化每个请求。
例如,如果您的应用程序不使用会话机制,或者如果你想启动会话处理,你应该把
auto_start
设置为假
在存储
关键的factories.yml
文件,如清单18日至19日。清单18日至19日,关闭会话
myapp / config / factories.yml
:存储类:sfSessionStorage参数:auto_start:假的
同样的适用于数据库(“调整模型”一节的解释在本章早些时候)和输出逃离特性(见第7章)。如果你的应用程序并没有使用,禁用它们小的性能,这一次的
settings.yml
文件(请参见清单18 - 20)。清单18 - 20 -关闭功能,
myapp / config / settings.yml
:.settings: use_database: #数据库和模型特点escaping_strategy: #输出转义功能
至于安全性和flash属性特征(见第六章),您可以禁用它们
filters.yml
文件,如清单21所示。清单21 -关闭功能,
myapp / config / filters.yml
呈现:~ web_debug: ~安全:启用:#一般,你会想在这里插入您自己的过滤器缓存:~常见:~::启用了执行:~
只在开发一些功能是有用的,所以你不应该激活他们的生产。以来,这种情况已经在默认情况下,生产环境在symfony是优化性能。ob娱乐下载在performance-impacting发展特性,
SF_DEBUG
模式是最严重的。至于symfony日志ob娱乐下载,特性也是默认关闭生产。你可能想知道如何获取信息失败请求生产如果日志是禁用的,并且认为出现问题不仅在发展。幸运的是,symfony可ob娱乐下载以使用
sfErrorLoggerPlugin
插件,它在后台运行在404年和500年生产和日志的详细信息在数据库错误。它要快得多文件日志记录功能,因为只有当一个方法被调用插件请求失败,记录机制,一旦打开,添加了一个不可忽视的开销无论水平。检查安装说明和手册http://www.ob娱乐下载symfony-project.com/wiki/sfErrorLoggerPlugin。提示
确保你定期检查服务器错误日志——他们也包含对404年和500年非常有价值的信息错误。
优化代码
也可以加快您的应用程序通过优化代码本身。本节提供了一些见解关于如何做到这一点。
核心编译
加载10个文件需要更多的I / O操作比加载一个长文件,尤其是慢磁盘上。加载一个很长的文件比装入小文件需要更多的资源——尤其是如果文件内容的很大一部分是没有使用PHP解析器,这是评论。
所以合并大量文件和剔除它们包含的评论是一个操作,提高了性能。ob娱乐下载Symfony已经优化;它被称为核心编译。一开始的第一个请求(或清除缓存后),一个symfony应用程序连接的所有核心框架类(ob娱乐下载
sfActions
,sfRequest
,sfView
等等)到一个文件中,优化文件大小通过删除评论和双空格,并将它保存在缓存中,在一个文件中config_core_compile.yml.php
。每个后续的请求只加载这个单一优化文件而不是30文件组成。如果您的应用程序必须加载的类,特别是如果他们是大班的评论,可能会带来好处将它们添加到核心编译文件。这样做,只是添加一个
core_compile.yml
文件在您的应用程序配置/
目录,列表中您想要添加的类,如清单。清单在18到22岁-核心编译文件,添加你的类
myapp / config / core_compile.yml
- % SF_ROOT_DIR % / lib / myClass.class。php - % SF_ROOT_DIR % /应用程序/ myapp / lib / myToolkit.class。php - % SF_ROOT_DIR % /插件/编写myPlugin / lib / myPluginCore.class。php……
sfOptimizer插件
ob娱乐下载Symfony还提供另一个优化工具,叫做
sfOptimizer
。它适用于各种symfony和应用程序代码的优化策略,这可能会进一步加速执行。ob娱乐下载symfob娱乐下载ony的代码数量很多依赖配置参数的测试,应用程序也可以这样做。例如,如果你看看symfony类,你会经常看到一个测试的值ob娱乐下载
sf_logging_enabled
参数调用之前sfLogger
对象:如果(sfConfig::得到(“sf_logging_enabled”)){这个美元- >getContext()- >getlog()- >信息(“在那里”);}
即使
sfConfig
注册表优化,调用它的数量get ()
方法在处理每个请求是很重要的——数量在最后性能。其中的一个sfOptimizer
优化策略是将配置常量的值——只要这些常数在运行时不受改变。是这样,例如,sf_logging_enabled
参数;当它被定义为假
,sfOptimizer
将前面的代码转换为以下几点:如果(0){这个美元- >getContext()- >getlog()- >信息(“在那里”);}
这还不是全部,因为这样一个明显的测试前也得到优化的一个空字符串。
应用优化,您必须首先安装该插件http://trac.ob娱乐下载symfony-project.org/wiki/sfOptimizerPlugin然后调用
优化
任务,指定一个应用程序和一个环境:> ob娱乐下载symfony优化myapp刺激
如果你想要其他的优化策略应用到您的代码,
sfOptimizer
插件可能是一个不错的起点。总结
ob娱乐下载Symfony已经是一个非常优化的框架和能够处理高流量网站没有问题。但如果你真的需要优化应用程序的性能,调整配置(是否服务器配置、PHP配置或应用程序设置)你将获得提振。你也应该遵循良好的实践编写高效的模型方法;由于数据库通常是web应用程序中的一个瓶颈,这一点应该要求所有你的注意力。模板也可以受益于一些小窍门,但是最好的刺激总是来自缓存。最后,不要犹豫地看看现有插件,因为其中一些提供创新技术进一步加快交付web页面(
sfSuperCache
,sfOptimizer
)。
这项工作是GFDL许可执照。