深入浅出Symfony2 - 如何提高网站响应速度

news/2024/5/9 22:02:59/文章来源:https://cpongo.blog.csdn.net/article/details/89019812

简介

\u0026#xD;

Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快、性能高等特点。但Symfony2的学习曲线也比较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性。相对其他框架,Symfony2比较吸引人的特点有:

\u0026#xD;
  1. 支持DI(Dependency Injection,依赖注入)和IoC(Inversion of control)。\u0026#xD;
  2. 高性能。\u0026#xD;
  3. 扩展性强。\u0026#xD;
  4. 文档成熟、拥有成熟的社区支持。\u0026#xD;

本文通过对一个基于Symfony2框架所开发的网站页面进行逐步优化,最终实现页面加载速度的提高的例子,向读者介绍Symfony2框架的一些核心功能和特点。通过阅读本文,你可以通过一些具体的例子了解Symfony2框架的优秀特性和技术特点,从而体会到使用Symfony2框架可以为网站开发带来的各种优势。

\u0026#xD;

适合人群

\u0026#xD;
  • 本文适用于希望提高PHP语言的开发技术,或者对Symfony2框架有兴趣的读者。\u0026#xD;
  • 本文也适用于系统架构师和各类技术决策者。\u0026#xD;

1.Symfony2的运行环境的设置

\u0026#xD;

在我所演示的项目中,已经包含了一个页面,通过输入这个地址来打开它:http://your.host.com/appdev.php/testpage_1。出现的页面如下图所示:

\u0026#xD;

31483239eb81bfd36d9ca826573f3025.jpg\"

\u0026#xD;

我们打开浏览器自带的调试功能,然后刷新页面:

\u0026#xD;

9e811dc5828dfb4cdcf3e7d10bbcc4bc.jpg\"

\u0026#xD;

可以看到,该页面充斥着大量的js/css/图片文件,而整个页面的加载速度竟然达到了9.6秒。

\u0026#xD;

而如果打开这个页面:http://your.host.com/app.php/testpage1,出现的页面如下图所示:

\u0026#xD;

4803b529d69253f1d0b193f340c27cd8.jpg\"

\u0026#xD;

我们发现页面的加载速度变成了4秒,同时众多js和css文件被各自合并成为了两个单独的文件(图中红框的部分)。

\u0026#xD;

造成上面两个页面打开速度截然不同的原因在于:如果通过不同的入口文件(app.php和appdev.php)进入页面,Symfony2会根据入口文件的不同,切换到不同的运行环境。比如在默认配置中:通过app.php访问的页面,就是生产环境,而通过appdev.php访问的页面,则是开发环境。Symfony2根据运行环境的不同,运行程序时的配置也会不同。比如细心的读者可能会发现,开发环境中页面的下方多了一条像是工具栏一样的东西(这是Symfony2特有的开发调试栏)。环境的不同会影响Symfony2程序运行的各个环节,以下列举了一些比较重要的不同配置下的差异处:

\u0026#xD;
功能开发环境生产环境
---------------
开发调试栏会出现不会出现
日志记录记录详细的程序执行信息只在程序出现错误的时候记录
css/js合并不会

所以可以看出,css/js文件合并其实是Symfony2自动根据环境不同所开启或关闭的一个自带功能罢了,这个功能在Symfony2中叫做Assets管理,当然我们也可以通过控制入口文件来实现开启或者关闭其他更多的功能。

\u0026#xD;

通过Symfony2的环境配置功能开启或关闭各种自带功能就像在文本里改一个参数那么简单,而每个不同的环境又有一套独立的环境配置。Symfony2提供了大量的参数供用户方便的配置各种功能,通过对不同环境下的各个功能进行配置,可以很方便的设置出一套适合你自己的工作/生产环境。

\u0026#xD;

接下来让我们看看Assets管理模块还能为我们做什么。

\u0026#xD;

2.深入Assets管理

\u0026#xD;

通过对上述页面的分析,我们发现虽然js和css文件合并了,但各自的文件内容却没有经过压缩,两个文件的大小分别是437k和310k,这显然是一个不太合理的数字。但我们可以通过简单的配置,让Assets管理模块帮我们在合并文件的同时对内容也进行压缩。

\u0026#xD;

例如我们选择使用uglifyjs2对js进行压缩,用yuicompressor对css进行压缩。在这些软件已经安装完毕的情况下,只需要修改app/config.yml的以下几行:

\u0026#xD;
\u0026#xD;assetic:\u0026#xD;    debug:          \"%kernel.debug%\"\u0026#xD;    use_controller: false\u0026#xD;    bundles:        ['ScourgenHFS2Demo1Bundle']\u0026#xD;    java: /usr/bin/java\u0026#xD;    filters:\u0026#xD;        cssrewrite: ~\u0026#xD;        uglifyjs2:\u0026#xD;            compress: true\u0026#xD;            mangle: true\u0026#xD;            bin: /opt/local/bin/uglifyjs\u0026#xD;        yui_css:\u0026#xD;            jar: /usr/share/yuicompressor-2.4.7.jar\u0026#xD;
\u0026#xD;

然后在layout模板中引入js/css的地方分别增加一个过滤器

\u0026#xD;
\u0026#xD;'@ScourgenHFS2Demo1Bundle/Resources/public/css/public_home.css'\u0026#xD;'@ScourgenHFS2Demo1Bundle/Resources/public/css/inner_city_line.css'\u0026#xD;filter='?yui_css'\u0026#xD;%}\u0026#xD;\u0026lt;link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"{{ asset_url }}\" /\u0026gt;\u0026#xD;\u0026#xD;...\u0026#xD;\u0026#xD;'@ScourgenHFS2Demo1Bundle/Resources/public/js/common/title.js'\u0026#xD;filter='?uglifyjs2'\u0026#xD;%}         \u0026#xD;
\u0026#xD;

我们再执行一下生成Assets的命令:

\u0026#xD;
\u0026#xD;% php app/console assetic:dump  --env=prod                                                                                                                                  \u0026#xD;Dumping all prod assets.\u0026#xD;Debug mode is off.\u0026#xD;03:14:06 [file+] /Users/scourgen/Desktop/InfoQ/\u0026#xD;optimize_performance_of_pages_with_symfony2/HeadFirstSymfony2-Demo1/app/../web/css/2ff013f.css\u0026#xD;03:14:14 [file+] /Users/scourgen/Desktop/InfoQ/\u0026#xD;
\u0026#xD;

然后再打开刚才生产环境下的页面,这时会发现刚才的两个css和js文件的大小已经变成了271k和232k,文件内容也已经都变成了经过uglifyjs2和yuicompressor压缩之后的内容。虽然两个文件大小依然很大,但如果考虑到它们在经过gzip压缩后的文件大小只有86k和39k,也应该算是在合理范围之内了。

\u0026#xD;

当然在实际开发中,我们经常会碰到虽然服务端的js/css文件内容修改了,但客户端却保留着旧版本的缓存,导致页面样式和js功能出现问题的情况,而为了解决这个问题,同样可以通过修改配置实现:

\u0026#xD;
\u0026#xD;#app/config.yml\u0026#xD;#将framework的templating改成如下的样子:\u0026#xD;…\u0026#xD;templating:\u0026#xD;    assets_version: 1\u0026#xD;    assets_version_format: %%s?%%s\u0026#xD;    engines:\u0026#xD;        - twig\u0026#xD;    assets_base_urls:\u0026#xD;        http:\u0026#xD;            - http://server1.dev\u0026#xD;            - http://server2.dev\u0026#xD;...\u0026#xD;
\u0026#xD;

然后为css合并文件指定一个文件名:

\u0026#xD;
\u0026#xD;'@ScourgenHFS2Demo1Bundle/Resources/public/css/public_home.css'\u0026#xD;'@ScourgenHFS2Demo1Bundle/Resources/public/css/inner_city_line.css'\u0026#xD;filter='?yui_css'\u0026#xD;output='css/a.css'\u0026#xD;%}\u0026#xD;
\u0026#xD;

我们再刷新一下页面,看看发生了什么。

\u0026#xD;

这时刚才两个js和css的URL分别变成了:

\u0026#xD;
  • http://server1.dev/css/a.css?1\u0026#xD;
  • http://server2.dev/js/9ad140b.js?1\u0026#xD;

虽然js和css文件的url后面都带上了一个变量(也就是上面所定义的assets_version),而由于URL的不同,客户端将会重新下载这两个文件以避免从缓存中读取旧的版本。但为什么这两个文件的地址会变成serverx.dev呢?

\u0026#xD;

其实这是Assets管理模块的另外一个功能:将它所管理的文件路径变成绝对地址(也就是增加了上面配置文件中的http://server1.dev和http://server2.dev两个域名)。而且在配置了多个域名的情况下,哪个文件名匹配哪个域名是固定的,不会随机显示造成带宽浪费,而这其实是由它的一套算法实现的。

\u0026#xD;

通过这样的修改,我们也得到了两个益处:

\u0026#xD;
  1. 当页面的js/css/图片文件很多时,由于这些URL的域名都不一样,可以让浏览器在同一时间并发下载更多的文件,从而加快页面打开的时间(参考:浏览器并发连接数)。\u0026#xD;
  2. 由于这些URL的域名和网页所在的域名不一样,所以HTTP头里不会携带cookie信息,能够减少网络带宽,从而实现cookie-free domain。\u0026#xD;

类似的情况也有很多,在开发中为了实现最佳实践我们往往需要绞尽脑汁,但如果使用Symfony2作为开发框架则会使问题变得非常简单,甚至简单到根本不用写代码,只需要更改几行配置就能实现。

\u0026#xD;

话说回来,在经过这些调整之后,前端的载入速度看起来已经不错了。那么Symfony2是否也可以很方便的调试和优化后端代码?答案是肯定的。接下来我们看一下如何使用Symfony2调试和优化程序的性能。

\u0026#xD;

3.调试和开发工具介绍

\u0026#xD;

调试和优化程序的最基本前提就是:你得知道你的程序在干什么。这句话虽然说得轻巧,但在许多框架面前却很难做到。这些框架在各种高新技术的封装下,代码和程序逻辑也变得十分复杂和臃肿,想要得知你所使用的框架背后到底做了哪些具体的事情、或者想获取程序运行的堆栈和调用信息、以及MySQL/NoSQL/MessageQueue……这些服务的调用和执行情况等等,都是不太容易的。而在没有这些信息支持的情况下,想去对后端程序做调试和优化几乎是不可能的。

\u0026#xD;

而获取这些信息以便进行开发和优化对于Symfony2来说却非常容易,原因有三个:

\u0026#xD;
  1. Symfony2有一个调试工具栏,能够在每一个页面打开时,在页面的最下方显示该页的程序调试信息,甚至能够从中直接找出导致页面响应速度缓慢的瓶颈。Symfony2自带的调试工具栏非常强大,下面选一个比较酷的功能给大家演示一下:\u0026#xD;

0e21d87f730ba4c0e85350ddc2929463.jpg\"

\u0026#xD;

上图是一个显示程序执行顺序以及耗时的界面,通过这个界面,开发者可以很直观的看到程序的详细执行流程和顺序。通过这个界面,也可以看到每个步骤所占用的时间,从而发现影响程序执行速度的瓶颈,从而有针对性的进行优化。比如上图所示的程序执行流程里,一眼就能看出一共有三个地方执行的时间比较久(青色的条比较长)。

\u0026#xD;
  1. \u0026#xD;

    高效且合理的框架设计使得Symfony2框架内的每个模块都不互相耦合,每个模块都有自己的职责,可以单独为其执行测试用例而不依托其他模块。每个模块也都会像一个独立的软件一样有其自己的版本发布周期,有的模块甚至拥有独立的维护团队。这样的设计让Symfony2取得了复杂性和扩展性之间的平衡,也完成了架构上的解耦,从而直接在架构层面降低了整个框架的复杂度。所以对于开发者来说,不论是开发新功能,还是优化现有程序,都会觉得非常方便和高效。

    \u0026#xD; \u0026#xD;
  2. \u0026#xD;

    日志记录功能把框架在执行时的全过程都完完全全记录在了日志中,你唯一需要担心的就是及时清理日志以免磁盘空间占用过大。下图是日志的一部分,可以看到日志所记录的信息是非常详细的,让人不禁联想起了一些重量级Java框架的日志的输出。

    \u0026#xD; \u0026#xD;

c8989183affe92246a107b845de92361.jpg\"

\u0026#xD;

所以综上三点所述,Symfony2对于调试和优化是非常友好的,利用其自带功能和设计可以很方便的进行调试和优化。

\u0026#xD;

Symfony2本身已经做得非常出色了,那么在Symfony2之外呢?

\u0026#xD;

虽然大家在国内可能不太听得到Symfony2这个名字,但在国际市场上Symfony2可是非常出名的。许多IDE软件开发商都支持Symfony2(比较出名的有PHPStorm、NetBeans和Eclipse with PDT),通过这些软件对于Symfony2的支持,能够让开发者更加方便快捷的进行开发工作。

\u0026#xD;

而对于开源软件开发者,以及一些大网站的技术团队而言,他们也围绕Symfony2框架做了很多工作,也开源了许多他们自己的模块。在Symfony2的托管平台Github上,Symfony2项目的fork量和star量分别为6428和2174(截止2013年4月中旬),位居所有PHP项目的前列。而在最近发布的对2.2版本的开发统计显示,共有2035次提交以及711次申请合并,平均每天11次提交和4次申请合并。如此频繁的代码变更速度也能证明Symfony2以及相关社区的活跃度。

\u0026#xD;

有如此强大的开发工具和社区支持,不管开发者在碰到什么问题时,基本上都可以迎刃而解。当然就算碰到了比较复杂的难题,也可以在Symfony2的社区或IRC频道中询问其他开发者。当然也可以来找我,我的联系方式在本文最下面。

\u0026#xD;

4. 如何使用缓存

\u0026#xD;

对于优化程序性能来说,一般会有三个方向:

\u0026#xD;
  1. 优化代码语法\u0026#xD;
  2. 优化业务逻辑\u0026#xD;
  3. 优化框架及系统\u0026#xD;

代码语法的优化并非本文的主题,而业务逻辑则又是由具体的网站功能所决定的,并不会有什么放之四海皆准的办法,所以本节主要介绍的是如何更加高效的使用Symfony2框架所附带的功能来提高网站的响应速度。

\u0026#xD;

下面介绍一下Symfony2中最重要的优化功能之一 - 页面缓存功能。

\u0026#xD;

对于一个页面来说,经常会有多个程序块来负责分别处理不同的页面部分,比如上文我们所展示的这个页面中,可能会有一块程序来处理页面上方的黑色导航条:显示所有的公交信息及判断用户所在地点;一块程序来处理页面的中间部分:根据用户是否登录显示不同的内容;一块程序来处理页面下方的线路详情信息;而这个页面的最终内容其实就是页面样式模板加上这三个程序输出后的结果。如果希望加快页面速度,最好的办法就是加快这三个程序的输出结果,甚至将结果缓存起来以便今后直接调用。

\u0026#xD;

那我们看看如何对页面进行缓存,下面我将通过一个例子来向读者展示如何做到这点。

\u0026#xD;

使用页面片段缓存,我们先要在包含其他页面片段的代码上增加一个standalone参数:

\u0026#xD;

{% render url('layout_top', {}) with {}, {'standalone': true} %}

\u0026#xD;

然后在这个处理页面片段的方法上配置缓存信息。

\u0026#xD;
\u0026#xD;/**\u0026#xD; * @Route(\"/esi/getTop\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_751852.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过图片优化,我将网站大小减少了62%

图片是Web提供的最基本的一种内容类型。人们都说一张图片胜过千言万语。但如果你一不小心,它也可能占用你好几兆带宽。 虽说Web图像应该尽可能清晰明快,但文件大小必须是可管理的,以便保持较快的加载速度,并且应该将数据使用保持在…

如何让 HR 找到你? 你需要进行个人SEO优化!(一)

编辑丨April Shen专栏丨九章算法互联网和许多在线招聘平台的出现为雇主和求职者提供了更多的选择。招聘人员和雇主经常通过互联网和在线招聘平台搜索适合他们公司的求职者,而根据他们不同的招聘要求,他们的搜索选项也并不仅限于谷歌和Bing,他…

假期不想在躺尸中度过?推荐你十个优质编程网站

撰文 | April专栏 | 九章算法对于软件开发人员来说,保持编程的竞技水平是非常有必要的。通过解决不同类型的编程难题,迎接不同类型的编程挑战,不仅能让你成为处理问题的高手,帮助你了解编程语言的复杂性,还能让你学习到…

038制作web服务器和发布网站

一、web服务器的作用 我们写的品优购网站,目前是放到自己电脑上的,只能自己访问浏览。 如果想要很多人访问我们的网站,可以把品优购放到服务器上,这样就可以多人访问我们的品优购网站了。 二、什么是web服务器 服务器&#xf…

python+selenium 登录xx网站

2019独角兽企业重金招聘Python工程师标准>>> 1.操作系统是MAC 64bit 自带的python,编码是UTF-8 2.在页面https://pypi.python.org/pypi/selenium 上下载selenium 3.将selenium的压缩包拷贝到python目录下,然后解压 4.更换管理员权限 5.到sele…

只知道LinkedIn的你,错过了多少机会!美帝十大求职网站收好

1、Indeed http://www. Indeed.com/ 职位搜索大佬 Indeed是美国职位搜索引擎中的元老级人物。Indeed可以为求职者提供一些宝贵的数据信息,如基本工资,人均职位和行业就业趋势。 优势 大公司HR的人气王,世界五百强的招聘信息都能在Indee…

IIS7.5中调试.Net 4.0网站出现无厘头500错误的解决办法 (转)

刚刚 部署了ii7的dll的有x86写的,就会出现以下这样的问题 iis 7 x86,Could not load file or assembly Name or one of its dependencies. An attempt was made to load a program with an incorrect format. 解决这样的,只要设置一下iis兼容x86程序就可…

设计师必备!免费下载 PSD 素材的32个网站

今天我想和大家分享一组可以免费下载 PSD 图形素材的最好的网站。 PSD 文件是非常有用的资源,因为你可以看到所有的层,使用了什么技术来创建出这些作品和效果。 某些列出的网站可能已是众所周知的,但你会惊奇地发现他们也提供免费的 PSD 文件…

十周后,62%的PHP网站将运行在一个不受支持的PHP版本上

根据W3Techs的统计数据,目前约有78.9%的网站使用PHP开发。\u0026#xD;\u0026#xD;但是,PHP 5.6.x的安全支持将在2018年12月31日正式停止,这标志着对古老的PHP 5.x分支版本的支持都将结束。\u0026#xD;\u0026#xD;也就是说,…

码农的暑期专属学习网站,赶紧get起来吧!

暑假,又到了立flag的时刻,此刻的你,是否已经准备好了满满一张to do list,不管有没有,小编已经准备了一份码农专属的SUMMER BUCKET LIST,快来装备自己,打响你的专属假期吧。 暑期第一弹 快乐的肥…

全球SEO行业调查报告

这是一份来自MOZ的调查报告,本报告是两年一次的SEO行业调查,主要围绕SEO从业人员的特征、工作内容时间分配比例、对未来市场的看法、使用的seo工具以及SEO知识扩充渠道等展开。 这份报告可以对从事或即将从事SEO行业的朋友对本行业有一个大致的了解与判…

wordpress商城源码_外贸B2C商城建站系统,选择WordPress, Shopify, Magento还是Opencart?

很多做跨境B2C电商平台的用户, 无论Amazon, eBay还是速卖通, 都在考虑做一个B2C独立站用来辅助, 好处非常多, 我会在后面讲课里再详细讲解到. 那么外贸B2C商城建站系统到底该怎么选呢, WordPress, Shopify, Magento还是Opencart? 目前网上关于外贸B2C商城建站系统的文章, 都是…

让您的网站拥有MSDN资源库搜索功能[转摘MSDN]

方式一 在您需要添加MSDN搜索链接的地方添加以下代码&#xff1a;<script language"Javascript" src"http://www.microsoft.com/china/msdn/search/msdn_search.js"> </script>使用以上代码&#xff0c;产生的搜索样式如下图所示&#xff1a;注…

有哪些高质量的自学网站?

分享10个程序员优质自学网站~ 1. Github Github是程序员托管代码的平台&#xff0c;很多开发者都会在上面找各种各样的开源项目来学习。阿里、腾讯、字节跳动、美团、Google、Micosoft等国内外大厂都有自己的Github开源库。 如果你做的东西正好符合一些公司的要求&#xff0…

【网站使用】使用joomla 把数据制作进入安装包

2019独角兽企业重金招聘Python工程师标准>>> 制作安装包&#xff0c;为客户提供&#xff0c;使用方便快捷&#xff01; 一、从数据导出数据 登陆phpmyadmin 二、依次选择导出全选&#xff0c;另存文件&#xff0c;勾选drop table执行&#xff0c;保存到桌面&#xf…

神奇的滚动动画,30个视差滚动网站设计

使用 HTML5 和 CSS3&#xff0c;我们能够在浏览器中创建更有趣和更吸引眼球的效果。其中&#xff0c;视差滚动&#xff08;Parallax Scrolling&#xff09;就是这样的效果之一。这种技术通过在网页向下滚动的时候&#xff0c;控制背景的移动速度比前景的移动速度慢来创建出令人…

大社区型网站的架构总结之如何标示用户在使用哪个功能程序篇(草稿)

人是最会模仿的动物&#xff0c;很多先进的发明创造&#xff0c;并不是人类凭空想象出来的&#xff0c;而是仿造出来的&#xff0c;仿造的对象不是各种神奇的动物就是大自然的现象。 所以其实在软件开发中也是这样&#xff0c;真正的专家是最善于应用经验证明是有效的解决方案的…

第1章 大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> ##1.1 大型网站软件系统的特点## 高并发&#xff0c;大流量&#xff1a;需要面对高并发用户&#xff0c;大流量访问。 高可用&#xff1a;系统7*24小时不间断服务。 海量数据&#xff1a;需要存储&#xff0c;管理海量数…

推荐一个攻城狮教程工具类网站

2019独角兽企业重金招聘Python工程师标准>>> 今天查JS的一些框架&#xff0c;无意进入了一个网站http://www.w3cschool.cc/。浏览了一下之后&#xff0c;发现真是。。棒极了&#xff01;&#xff01;这个网站提供了多种语言和框架的入门教程&#xff0c;内容很丰富&…

前端工程师一般都喜欢去哪些网站逛?

推荐一些“小而美”的优质网站&#xff0c;前端学习提升、技术博客、实用工具……从多个方面实现提升&#xff0c;才是前端工程师的晋级之路&#xff01; 先赞再看&#xff0c;养成习惯&#xff01; 前端学习提升类 当前&#xff0c;前端开发正在迅猛发展阶段&#xff0c;不…