仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1331|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页编程之代码从业者的一次php使用优化理论

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:36:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
接触MYSQL,开始设计数据库程序      体系跑得工夫长了,总会呈现如许那样的成绩和瓶颈,有了成绩不成怕,咱们有“打虎”的家伙事儿--不过就是定位成绩->剖析成绩->提出处理计划->理论->了局反应->总结再优化。
  之前做过的一次优化理论,比来翻出来看看,有些通用的优化手腕仍是可以复用的。体系跑得工夫长了,总会呈现如许那样的成绩和瓶颈,有了成绩不成怕,咱们有“打虎”的家伙事儿--不过就是定位成绩->剖析成绩->提出处理计划->理论->了局反应->总结再优化。
  成绩描写:体系采取 PHP5 + Zend framework 开辟,在数据范围和会见量增添后(万万级),呈现了后台apache办事器负载太高的景象,在会见岑岭时段(好比天天上班到早晨10点这一段工夫,出格是周五),机械CPU负载会飙升到170多,CPU负载太高形成处置恳求也响应的变慢,所以亟需处理这个成绩。
  成绩剖析:经由过程一连几天的察看和剖析,当CPU利用率到达100%时,个中体系CPU利用率占有了很大的比例,用户CPU利用率倒不是很高,别的前端 haproxy 和 squid cache的cpu负载很低,memcached和squid的hit ratio普通都能到达60%摆布。
  剖析backend的access-log,发明相当大一局部恳求的User-Agent是搜刮爬虫;
  同时,在 apache 上设置装备摆设了xdebug,在余暇时段对次要的页面的丈量了一组功能数据,经由过程利用kcachegrind对测得的数据停止剖析(若何设置装备摆设xdebug,可以用soso搜一下),发明:
  功能数据不敷不乱,一样的恳求之间测试数据会相差对照大
  慢的点对照分离
  memcached的会见大局部的情形都对照慢(100ms以上)
  处理计划经由过程上述初步的剖析,对现有的法式慢慢作了一系列调剂。
  起首思索到的是是不是可以想举措增添前端squid cache的Hit ratio,从而削减穿透squid抵达后端apache的恳求数。
  思索到相当一局部恳求来历于Crawler,而之前squid cache只会对设置了language cookie的恳求作cache,而来自Crawler的恳求都没有cookie信息。因而想到把来自Crawler的恳求都默许为language为zh_CN的,然后修正haproxy的设置装备摆设,把User-Agent为罕见的Crawler的恳求都转交给squid cache.
  修正php代码,把一些页面的缓存工夫设置得更长一些
  经由如上两个步调,抵达apache的恳求的确削减了一些,然而这个对cpu负载太高的成绩匡助很少,因而另寻它法。
  其次,依据利用 xdebug profiling的了局来看,和memcached的交互耗时对照长,因而想是不是可以想举措让memcached能更快地呼应恳求,从而使得每次恳求能更快完成,从而使并发下降。
  经由过程代码剖析,发明线上memcached利用的是poll(),而memcached的毗连数在忙碌的时分坚持在1000摆布,memcached的CPU利用率在 30% 摆布。很明显,poll()体例在处置如斯多的并发毗连时是很低效的。因而从头编译memcached,使其利用epoll()的体例来处置恳求,交换为epoll以后,memcached的cpu usage从 30%摆布下降到 3% 摆布,10倍之多!
  别的,memcached的hit ratio不是出格高,并且被换出的item数也对照高,因而想到对cache的内容作partition.本来盘算做 manually partition,后来发明php的最新的memcache扩大就可以撑持依据cache的key主动作partition,并且能在不修正法式代码(需求修正设置装备摆设文件:-))的情形下增添新的memcached实例。因而晋级每个apache的php memcache扩大,然后再设置装备摆设文件中增添了一台新的memcached。到此完成memcached的内容partition。修正以后的后果对照明显,页面的载入工夫比修正前延长了良多。
  经由这两步的调剂,memcached的效力比之前高了,然而apache的负载依然居高不下,没辙,再想其它举措!
  进一步深切剖析后面说到次要体系CPU占用很高,要找缘由只能深切内核了:) 从如今入手下手了咱们的strace之旅。套用一句Nike的告白词:Just strace it!
  在岑岭时段对 httpd 历程停止了strace,办法不过乎以下这些
  strace -p PID -c 得出 summary
  strace -p PID -o output.log 写入文件,渐渐研讨
  strace -p PID -e trace=file 只看 filesystem 操作相干的 syscalls
  strace -p PID -elstat64,stat64,open,getcwd 只跟踪这些 syscalls
  …
  从上述strace剖析失掉以下结论:
  lstat64,stat64,open等 syscalls其实是多啊
  上述 syscalls 占用工夫的确很多! 60%以上的工夫都被它们抢了, orz
  绝大多半 syscall 是掉败的,真是屡败屡战啊
  有了上述数据,咱们就找到了成绩的偏向了,那就是找这些毫有意义的体系挪用是怎样来的。
  经由剖析,这些是php要加载某一个类时,会去 include_path 中界说的一系列目次中搜索该类对应的文件,挨个目次这么试曩昔,直到找到为止。嗯,这类体例明显是对照低效的,有无更好的体例来完成这个工作呢?谜底是一定的,有!并且还有不止一种办法!
  挪用require_once()时,参数写相对途径(入手下手Guys write Zend Framework就不懂这个事理;后来才有更新))
  利用 __autoload()对class停止 lazy loading,也就是说真正需求的时分才去加载,而不是不论三七二十一把能够用到的类文件都require_once了。
  成绩是找到了,然而要处理这个成绩还面对着另外一个成绩。开辟中代码都注重用相对途径了,独一可以改善的中央是改成 lazy loading,然而 Zend Framework中大批的require_once采取绝对途径,这个就是招致成绩——这里我说的成绩是本文咱们议论的CPU负载太高的成绩——的基本缘由。
  OK,既然成绩找到了,下手处理。写个剧本主动生成 Class -> File Path 对应关系,生成代码中一切类和Zend Framework中一切类的对应关系文件。把代码中和Zend Framework库中一切的 require_once 都正文失落。然落后行具体的测试,然后上线。了局使人受惊,负载降到了 3 之内!!成绩处理。
  总结:
  写代码的人都晓得,能够出成绩的中央总会出成绩,任何成绩城市有个缘由(哪怕临时没有找到),从根上处理才是霸道,处理甚么成绩不主要,但愿人人能进修这个处理的思绪,擅长使用东西。ok,这个case就如许了。
<P style="TEXT-INDENT: 2em">
掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。
变相怪杰 该用户已被删除
沙发
发表于 2015-2-4 03:42:54 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
板凳
发表于 2015-2-9 07:10:17 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-9 20:49:20 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-21 21:21:12 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
山那边是海 该用户已被删除
6#
发表于 2015-3-6 21:54:41 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
若相依 该用户已被删除
7#
发表于 2015-3-13 21:46:50 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
小魔女 该用户已被删除
8#
发表于 2015-3-17 21:35:40 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
不帅 该用户已被删除
9#
发表于 2015-3-21 22:51:13 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
小女巫 该用户已被删除
10#
发表于 2015-3-27 00:08:26 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
深爱那片海 该用户已被删除
11#
发表于 2015-4-6 14:53:12 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
若天明 该用户已被删除
12#
发表于 2015-4-9 12:14:45 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
谁可相欹 该用户已被删除
13#
发表于 2015-4-12 14:02:27 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
admin 该用户已被删除
14#
发表于 2015-4-14 05:12:30 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
透明 该用户已被删除
15#
发表于 2015-4-17 10:55:34 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
只想知道 该用户已被删除
16#
发表于 2015-4-18 06:29:07 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
精灵巫婆 该用户已被删除
17#
发表于 2015-4-21 08:33:35 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
第二个灵魂 该用户已被删除
18#
发表于 2015-4-21 16:29:30 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
再现理想 该用户已被删除
19#
发表于 2015-4-22 03:16:52 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
灵魂腐蚀 该用户已被删除
20#
发表于 2015-5-6 11:09:47 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-30 00:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表