章18 -性能
如果你希望你的网站会吸引人群,性能和优化问题在开发阶段应该是一个主要因素。放心,性能一直是一个主要担忧symfony的核心开发人员。ob娱乐下载
而获得的优势通过加速开发过程导致一些开销,symfony的核心开发人员一直认识到性能需求。ob娱乐下载因此,每一个类和方法一直密切检查和优化尽可能快。的基本开销,你可以通过比较测量时间显示一个“hello, world”消息,没有symfony,是最小的。ob娱乐下载因此,框架是可伸缩的,反应压力测试。最终证明,一些网站极高交通(即网站拥有数以百万计的用户很多server-pressuring Ajax交互)使用symfony和它的性能非常满意。ob娱乐下载
当然,高流量的网站往往意味着扩大服务器农场和升级硬件,因为他们认为合适的。如果你没有资源来做这个,或者如果你想要确定框架的全功率总是在你的处置,有一些调整,您可以使用symfony应用程序进一步加快。ob娱乐下载本章列出了一些建议各级性能优化的框架,他们大多是为高级用户。他们中的一些人在前面的章节已经提到了,但你会发现它有用的都在一个地方。
调整服务器
一个优化的应用程序应该依靠优化服务器。你应该知道基本的服务器性能,以确保没有symfony以外的瓶颈。ob娱乐下载这里有一些事情要检查以确保您的服务器不是不必要的缓慢。
有magic_quotes_gpc
转真正的
在php . ini
减慢一个应用程序,因为它告诉PHP逃避所有报价请求参数,但symfony将系统unescape他们之后,唯一的后果将是一个浪费时间,quotes-escaping问题在一些平台上。ob娱乐下载因此,关闭此设置如果你有访问PHP配置。
最近您使用PHP版本,越多越好(PHP 5.3是速度比PHP 5.2)。所以一定要升级您的PHP版本受益于最新的性能改进。
使用一个PHP加速器(如APC, XCache,或eAccelerator)几乎是强制性的生产服务器,因为它可以使PHP运行平均快50%,没有权衡。确保您安装的一个加速器扩展PHP的实际速度。
另一方面,确保您禁用任何调试工具,如Xdebug或adp扩展,在生产服务器上。
请注意
你可能会感兴趣到底入侵造成的开销mod_rewrite
扩展:它是微不足道的。当然,加载图像与重写规则比加载图像没有放缓,但经济放缓数量级低于任何PHP语句的执行。
提示
当一个服务器是不够的,你还可以添加另一个,并使用负载平衡。只要上传/
目录共享和使用数据库存储会话,一个symfony项目反应无缝地在一个负载均衡体系结构。ob娱乐下载
调整模型
在syob娱乐下载mfony中,模型层的声誉是最慢的部分。如果基准测试显示你要优化这一层,这里有几个可能的改进。
优化推动或教义的集成
初始化模型层(核心ORM类)需要一些时间,因为需要加载的几类,构造不同的对象。然而,因为symfony的方式整合了orm,这些初始化任ob娱乐下载务发生只有当一个动作需要模型,尽可能晚。orm类将只有当初始化对象的生成模型自动装载。这意味着页面不使用模型不惩罚模型层。
如果你的整个应用程序不需要使用模型的层,也可以节省的初始化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
对象自动处理偏移量和推动查询水合物的限制只有一个给定页面所需的对象。
减少的数量与连接查询
在应用程序开发过程中,你应该留意发布的数据库查询每个请求的数量。web调试工具栏显示的数量为每个页面查询,数据库,点击小图标显示这些查询的SQL代码。如果你看到异常查询的数量不断上升,是时候考虑使用一个连接。
在解释连接方法之前,让我们回顾一下会发生什么当你遍历一个对象数组,使用推动getter检索相关类的详细信息,如清单整场。这个示例假设您的模式描述了一个文章
表的外键作者
表。
清单整场-检索相关类的详细信息在一个循环中
/ /在行动,与推动这个美元- >文章= ArticlePeer::doSelect(新标准());/ /或教义这个美元- >文章=学说::可以获得的(“文章”)- >findAll();/ /数据库查询出具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 ()
,所以它只提高了整体性能之后如果你使用水化对象。
优化你的查询与教义
教义有自己的查询语言称为DQL,教义的查询语言。非常类似于SQL的语法,但是允许检索对象而不是结果集的行。在SQL中,您需要返回表列文章
和作者
在相同的查询。DQL,解决方案是很容易做的事情仅仅是加入语句添加到原始查询,并相应地学说将水合物你的对象实例。下面的代码显示了如何使两个表之间的连接:
/ /在行动原则::可以获得的(“文章”)- >createQuery(“一个”)- >innerJoin(“a.Author”)/ /”。名为“作者”的作者”是指的关系- >执行();/ /模板(不变)< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章- >getTitle()? >写的,< ? php回声美元的文章- >getAuthor()- >getName()李? > < / >< ? phpendforeach;? >< / ul >
避免使用临时数组
使用推动时,对象是已经水分,所以不需要准备一个临时数组的模板。开发人员通常不习惯orm掉入这个陷阱。他们想要准备一个字符串数组或整数,而模板可以直接依赖现有的对象数组。例如,假设一个模板的列表显示所有文章的标题出现在数据库中。不使用面向对象的开发人员可能会编写代码类似于清单后所示。
清单后,准备一个数组的行动是没有用的,如果你已经有一个了
/ /在行动美元的文章= ArticlePeer::doSelect(新标准());美元的标题=数组();foreach(美元的文章作为美元的文章){美元的标题(]=美元的文章- >getTitle();}这个美元- >标题=美元的标题;/ /模板中< ul >< ? phpforeach(美元的标题作为美元的标题):? ><李> < ? php回声美元的标题李? > < / >< ? phpendforeach;? >< / ul >
这段代码是补水的问题是已经做的doSelect ()
调用(这需要时间),使美元的标题
数组是多余的,因为你可以写相同的代码如清单18-7所示。构建时间美元的标题
数组可以获得改善应用程序的性能。
清单18-7——使用一个对象数组免除您创建一个临时数组中
/ /在行动这个美元- >文章= ArticlePeer::doSelect(新标准());/ /与原则这个美元- >文章=学说::可以获得的(“文章”)- >findAll();/ /模板中< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章- >getTitle()李? > < / >< ? phpendforeach;? >< / ul >
如果你觉得你需要准备一个临时对象的数组,因为一些处理是必要的,这样做的正确方法是创建一个新的方法在你的模型类,直接返回这个数组。例如,如果您需要一个数组的文章标题和评论的数量为每一篇文章,行动和模板应该类似于清单18-8。
清单18-8 -使用一个自定义的方法来准备一个临时数组中
/ /在行动这个美元- >文章= ArticlePeer::getArticleTitlesWithNbComments();/ /模板中< ul >< ? phpforeach(美元的文章作为美元的文章):? ><李> < ? php回声美元的文章(“标题”]? >(< ? php回声美元的文章(“nb_comments”]? >评论)李< / >< ? phpendforeach;? >< / ul >
由你来构建一个快速的处理getArticleTitlesWithNbComments ()
方法在模型中——例如,绕过整个对象-关系映射和数据库抽象层。
绕过ORM
当你不真正需要的对象,但是只有几列各表,如在上一个示例中,您可以在模型中创建特定的方法绕过完全ORM层。你可以直接叫PDO的数据库,例如,并返回一个定制的数组。清单说明了带队打出了这个想法。
清单——使用直接带队打出了PDO访问优化模型方法,lib /模型/ ArticlePeer.php
/ /与推动类ArticlePeer扩展BaseArticlePeer{公共静态函数getArticleTitlesWithNbComments(){美元的连接=推动:getConnection();美元的查询=“选择% s作为标题,计数(% s)从% s nb_comments左加入% s % s = % sGROUP % s的;美元的查询=sprintf(美元的查询,ArticlePeer::标题,CommentPeer::ID,ArticlePeer::TABLE_NAME,CommentPeer::TABLE_NAME,ArticlePeer::ID,CommentPeer::ARTICLE_ID,ArticlePeer::ID);美元的声明=美元的连接- >准备(美元的查询);美元的声明- >执行();美元的结果=数组();而($ resultset=美元的声明- >获取(PDO::FETCH_OBJ)){美元的结果(]=数组(“标题”= >$ resultset- >标题,“nb_comments”= >$ resultset- >nb_comments);}返回美元的结果;}}/ /与原则类ArticleTable扩展Doctrine_Table{公共函数getArticleTitlesWithNbComments(){返回这个美元- >createQuery(“一个”)- >选择(”一个。标题,count (*) nb_comments”)- >leftJoin(“a.Comments”)- >groupBy(“a.id”)- >fetchArray();}}
开始构建这些方法时,您可能会编写一个定制的每个操作的方法,和失去的利益层分离,更不用说你失去数据库独立性。
加快数据库
有许多特定于数据库的优化技术,可以应用无论你使用symfony。ob娱乐下载本节将简要介绍最常见的数据库优化策略,但需要一个良好的数据库引擎和管理知识得到最出你的模型层。
提示
记住web调试工具栏显示每个查询页面,所花的时间和每一个调整应该监控以确定它是否真的提高了性能。
表查询通常是基于非主键列。提高查询的速度,你应该定义索引在数据库模式。添加一个列索引、添加指数:真正的
列定义属性,如清单18所示。
清单18 - -添加一个列指数配置/ schema.yml
#推动模式推动:文章:id: author_id:标题:{类型:varchar(100)指数:真正}#教条模式文章:列:author_id:整数标题:字符串索引(100):标题:字段:[标题]
您可以使用选择指数:独特的
语法定义一个唯一的索引,而不是经典的一个。您还可以定义多个列索引schema.yml
(请参考第八章更详细的索引的语法)。你绝对应该考虑这样做,因为它通常是一个好方法来加速一个复杂的查询。
添加一个索引模式之后,你应该做同样的数据库本身,通过发行一个添加索引
查询数据库中直接或通过调用propel-build-all
命令(这将不仅重建表结构,但也抹去所有现有的数据)。
提示
索引会让选择
查询速度快,但插入
,更新
,删除
查询是慢。同时,每查询数据库引擎只使用一个索引,他们推断出每个查询索引用于基于内部启发式。添加一个索引有时是令人失望的性能提升,所以一定要测量的改进。
除非特别说明,每个请求使用一个数据库连接在symfony中,年底和连接关闭请求。ob娱乐下载您可以启用持久数据库连接使用一个数据库连接池,保持开放之间的查询,通过设置持久性:真
在databases.yml
文件,如清单18-11所示。
清单18-11 -使持久数据库连接支持,配置/ databases.yml
刺激:推动:类:sfPropelDatabase参数:dsn: mysql: dbname =例子;主机= localhost用户名:用户名密码:密码持久:真正的#使用持久连接
这可能会或可能不会提高数据库的整体性能,取决于许多因素。关于这一欧宝官网下载app主题的文档是在互联网上丰富的。确保你基准应用程序性能改变这个设置之前和之后来验证其利益。
侧边栏
mysql的技巧
很多MySQL配置的设置,文件在my . cnf中所做,可能改变数据库的性能。确保你在线阅读欧宝官网下载app在这个问题上。
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 >”);}
调整缓存
第十二章已经描述了如何响应的缓存部分或全部。响应缓存导致的一个主要性能改进,它应该是你的第一个优化的考虑。如果你想充分利用缓存系统,深入阅读,本节揭示你可能没有想到的一些小技巧。
清算的选择性部分缓存
在应用程序开发过程中,你必须在各种情况下清除缓存:
- 当您创建一个新类:添加一个类一个半自动的目录(项目之一
lib /
文件夹)并不足以symfony自动非开发性环境中找到它。ob娱乐下载你必须清楚半自动的配置缓存,以便symfony再次浏览的所有目录ob娱乐下载autoload.yml
文件和引用的位置——包括新的autoloadable类。李< / > - 当你改变生产的配置:配置在生产中只在第一个请求解析。进一步的请求使用缓存的版本。所以在生产环境中配置的改变(或任何环境中调试是关闭的)不生效,直到您清除缓存文件的版本。李< / >
- 当你修改模板的环境中,模板缓存启用:有效的缓存模板总是用来代替现有的模板在生产中,所以一个模板更改被忽略,直到模板缓存清除或过时了。李< / >
- 当你更新的应用程序
项目:部署
命令:这种情况下通常涵盖了前三的修改。李< / >< / ul >清算整个缓存的问题是,下一个请求需要很长时间的过程,因为需要重新生成缓存的配置。此外,模板不修改也会从缓存中清除,失去以前的请求。
这意味着它是一个好主意,只有真的需要重新生成缓存文件。使用的选项
缓存:清晰
任务定义的一个子集清除缓存文件,如清单18-14所示。清单18-14 -结算只选择部分缓存
/ /清楚只有前端应用程序的缓存php symfony缓存:美元清楚前端/ /清楚只有HTML前端应用程序的缓存phob娱乐下载p美元symfony缓存:明确前端模板/ /清楚只有配置缓存的前端应用程序缓存php symfony美元:清晰的前端配置
你也可以手动删除文件
缓存/
目录,或清除模板缓存文件选择性的行动缓存管理器- >删除()
第十二章中描述的方法,如。所有这些技术将最小化的负面的性能影响前面列出的任何变化。
提示
当你升级symfony,缓存会自动ob娱乐下载清除,没有人工干预(如果你设置
check_ob娱乐下载symfony_version
参数真正的
在settings.yml
)。生成缓存页面
当你部署一个新应用程序来生产,模板缓存是空的。你必须等待用户访问这个页面的页面放在缓存中。在关键的部署,页面处理的开销是不可接受的,必须尽快可用缓存的好处第一个请求。
解决方案是自动浏览应用程序的页面的登台环境(配置类似于一个生产)生成的模板缓存,然后缓存的应用程序转移到生产。
自动浏览页面,一种选择是创建一个shell脚本,通过外部url的列表和一个浏览器(比如curl)。但是有一个更好更快的解决方案:一个PHP脚本使用
sfBrowser
对象,已经第15章中讨论。这是一个用PHP编写的内部浏览器(和使用sfTestFunctional
功能测试)。这需要外部URL,并返回一个响应,但有趣的是,它触发了模板缓存就像一个普通的浏览器。因为它只有一次初始化symfony和不通过HTob娱乐下载TP传输层,该方法快得多。清单18-15显示了一个示例脚本用于生成模板缓存文件的登台环境。通过调用启动它
php generate_cache.php
。清单18-15 -生成模板缓存,
generate_cache.php
require_once(目录名(__FILE__)。“/ . . / config / ProjectConfiguration.class.php”);美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“暂存”,假);sfContext::createInstance除外(美元配置);/ /数组的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 -缓存一个函数的结果
美元的缓存=新sfFileCache(数组(“cache_dir”= > sfConfig::得到(“sf_cache_dir”)。/函数的));fc美元=新sfFunctionCache(美元的缓存);result1美元=fc美元- >调用(“因为”,数组(M_PI));result2美元=fc美元- >调用(“preg_replace”,数组(' /\ s\ s+ / ',' ',输入美元));
的
sfFunctionCache
构造函数将一个缓存对象。的第一个参数叫()
必须是一个可调用的方法,所以它可以是一个函数的名字,一个数组类的名称和静态方法的名字,或一个数组对象的名称和公共方法名称。至于其他的参数叫()
方法,它是一个数组的参数将传递给调用。谨慎
如果您使用一个基于文件的缓存对象的例子,最好是给一个缓存目录下
缓存/
目录,它将被自动清理的缓存:清晰
的任务。如果缓存存储函数的其他地方,它不会自动清除时通过命令行清除缓存。缓存服务器中的数据
PHP加速器提供特殊功能将数据存储在内存中,这样您就可以在请求中使用它。问题是他们都有一个不同的语法,并且每个都有自己的特定的方式执行这一任务。symfob娱乐下载ony缓存类抽象所有这些差异,和任何你正在使用的加速器。在清单18-17看到它的语法。
清单18-17——使用一个PHP加速器缓存数据
美元的缓存=新sfAPCCache();/ /将数据存储在缓存中美元的缓存- >集(美元的名字,美元的价值,美元的一生);/ /获取数据美元的价值=美元的缓存- >得到(美元的名字);/ /检查数据在缓存中存在value_exists美元=美元的缓存- >有(美元的名字);/ /清除缓存美元的缓存- >清晰的();
的
设置()
方法返回假
如果缓存不工作。可以是任何缓存的值(字符串、数组、对象);的sfAPCCache
类将处理序列化。的get ()
方法返回零
如果在缓存中不存在所需的变量。提示
如果你想更进一步到内存缓存,确保你看看
sfMemcacheCache
类。它提供了相同的接口和其他缓存类和它可以帮助减少数据库负载均衡负载应用程序。未使用的功能才会安静下来
默认的symfony的配ob娱乐下载置激活一个web应用程序的最普遍的特征。然而,如果你不需要他们,你应该禁用他们节省时间初始化每个请求。
例如,如果您的应用程序不使用会话机制,或者如果你想启动会话处理,你应该把
auto_start
设置为假
在存储
关键的factories.yml
文件,如清单18 18所示。清单18 18 -关闭会话
前端/ config / factories.yml
:存储类:sfSessionStorage参数:auto_start:假的
同样适用于数据库功能(“调整模型”一节的解释在本章早些时候)。如果应用程序没有使用一个数据库,停用了一个小的性能,这一次的
settings.yml
文件(请参见清单18日至19日)。清单18日至19日,关闭数据库特性
前端/ config / settings.yml
:.settings: use_database:假#数据库和模式特性
至于安全特性(见第六章),您可以禁用它们
filters.yml
文件,如清单18 - 20所示。清单18 - 20 -关闭功能,
前端/ config / filters.yml
呈现:~安全:启用:假#一般,你会想在这里插入您自己的过滤器缓存:~执行:~
只在开发一些功能是有用的,所以你不应该激活他们的生产。以来,这种情况已经在默认情况下,生产环境在symfony是优化性能。ob娱乐下载在performance-impacting发展特性,调试模式是最严重的。至于symfony日志ob娱乐下载,特性也是默认关闭生产。
你可能想知道如何获取信息失败请求生产如果日志是禁用的,并且认为出现问题不仅在发展。幸运的是,symfony可ob娱乐下载以使用
sfErrorLoggerPlugin
插件,它在后台运行在404年和500年生产和日志的详细信息在数据库错误。它要快得多文件日志记录功能,因为只有当一个方法被调用插件请求失败,记录机制,一旦打开,添加了一个不小的开销无论水平。检查安装说明手册。提示
确保你定期检查服务器错误日志——他们也包含对404年和500年非常有价值的信息错误。
优化代码
也可以加快您的应用程序通过优化代码本身。本节提供了一些见解关于如何做到这一点。
核心编译
加载10个文件需要更多的I / O操作比加载一个长文件,尤其是慢磁盘上。加载一个很长的文件比装入小文件需要更多的资源——尤其是如果文件内容的很大一部分是没有使用PHP解析器,这是评论。
所以合并大量文件和剔除它们包含的评论是一个操作,提高了性能。ob娱乐下载Symfony已经优化;它被称为核心编译。一开始的第一个请求(或清除缓存后),一个symfony应用程序连接的所有核心框架类(ob娱乐下载
sfActions
,sfRequest
,sfView
等等)到一个文件中,优化文件大小通过删除评论和双空格,并将它保存在缓存中,在一个文件中config_core_compile.yml.php
。每个后续的请求只加载这个单一优化文件而不是30文件组成。如果您的应用程序必须加载的类,特别是如果他们是大班的评论,可能会带来好处将它们添加到核心编译文件。这样做,只是添加一个
core_compile.yml
文件在您的应用程序配置/
目录,列表中您想要添加的类,如清单21所示。清单21 -类添加到核心编译文件,
前端/ config / core_compile.yml
- % SF_ROOT_DIR % / lib / myClass.class。php - % SF_ROOT_DIR % /应用程序/前端/ lib / myToolkit.class。php - % SF_ROOT_DIR % /插件/编写myPlugin / lib / myPluginCore.class。php……
的
项目:优化
任务ob娱乐下载Symfony还提供另一个优化工具,
项目:优化
的任务。它适用于各种symfony和应用程序代码的优化策略,这可能会进一步加速执行。ob娱乐下载美元php ob娱乐下载symfony项目:优化前端刺激
如果你想看到任务实现的优化策略,看看任务源代码。
总结
ob娱乐下载Symfony已经是一个非常优化的框架和能够处理高流量网站没有问题。但如果你真的需要优化应用程序的性能,调整配置(是否服务器配置、PHP配置或应用程序设置)你将获得提振。你也应该遵循良好的实践编写高效的模型方法;由于数据库通常是web应用程序中的一个瓶颈,这一点应该要求所有你的注意力。模板也可以受益于一些小窍门,但是最好的刺激总是来自缓存。最后,不要犹豫地看看现有插件,因为其中一些提供创新技术进一步加快交付web页面(
sfSuperCache
,项目:优化
)。
这项工作是GFDL许可执照。