设为首页 收藏本站
查看: 607|回复: 0

[经验分享] PHP代码优化之缓存

[复制链接]

尚未签到

发表于 2017-3-24 10:29:00 | 显示全部楼层 |阅读模式
我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少。往往我们在追求这些的同时却失去了很多东西。下面我想讲讲我对PHP优化的理解。优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码。
  进行大范围的优化,而不是死啃某些程序代码
  我这里所说的优化,基本上都是从服务器,Apache,数据库这些方面来进行的优化,而并不是对你的PHP代码加以改进从而提高程序的运行速度,因为比起你将程序中的正则优化为字符串处理函数从而提升程序速度来说,在大范围内进行的优化所需要的代价要比这个小的多,而获得报酬却要丰厚的多。
  在非代码处进行优化有以下好处:
  1、通常情况下能够大大提高效率
  2、不会危及到代码的完整性
  3、能够快速部署
  缓存技术
  下面来说说常用的缓存技术,通过这些缓存技术能够大大的提高效率
  在说到缓存技术的时候不得不提到memcached ,memcached是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
  Memcached的原理
  memcached 是以守护程序方式运行于一个或多个服务器中,等待接收客户端的连接操作,客户端可以由各种语言编写(例如PHP)。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。
  说完memcached,下面来说说常用的缓存方法
  1、编译与OPCODE缓存
  因为PHP是解释型的语言,所以每个PHP文件在运行的时候都需要编译后再执行,同一个文件,不同的用户访问,或者同一个用户不同时间访问同一个文件,每次都需要重新编译然后运行,这样就耗费了大量时间。
  通过编译缓存每个文件在修改之后只编译一次这样就减少了文件IO操作,用户访问后机器指令直接从内存中取出并执行而不是硬盘中读出。
  最常见的PHP编译缓存工具有:APC,Accelerator,xcache
  2、全局页面缓存-- Squid Cache
  Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器,Squid作为网页服务器的前置cache服务器通过缓存相关请求来提高Web服务器的速度。
  3、局部缓存之SQL缓存
  在大多数应用程序中主要的瓶颈往往可以追溯到数据库的操作中,一般都是因为复杂的数据库查询而耗费了大量时间,而SQL缓存可以大大降低复杂查询造成的负荷。
  SQL缓存的例子(使用了memcached扩展)
  代码片段:

  $key= md5(“some sort of sql query”);
  if(!($result = memcache_get($key))) {
  $result= $pdo->query($qry)->fetchAll();
  //缓存查询结果一小时
  memcache_set($key,$result, NULL, 3600);
  }

  4、局部缓存之代码块缓存
  为了优化PHP程序,有时候我们不得不优化一个个代码段来减少那么一点点的执行的时间,但是比起优化复杂的不同的PHP代码段还不如通过缓存来直接忽略这些代码段的优化,这样做的好处是:
  1、能够很快的看到效果
  2、不会破坏以前的代码
  3、速度要比优化代码要快得多
  代码块缓存的列子(同样使用了memcached扩展)
  代码片段:

  functioncomplex_function_abc($a, $b, $c) {
  $key= __FUNCTION__ . serialize
  (func_get_args());
  if(!($result = memcache_get($key))) {
  $result= //函数代码
  //储存执行结果1小时
  memcache_set($key,$result, NULL, 3600);
  }
  return$result;
  }

  当然除了上述方法外还可以用到文件缓存(将数据库中的数据取出储存在文件中),还可以生成静态HTML文件等,但是这些方法的缓存还是将文件储存在硬盘上而不是内存中。
  输出控制
  除了上述缓存技术外还可以通过输出控制来让程序执行的时间更少
  下面通过PHP与APACHE来说说输出控制
  1、PHP输出控制
  这里最主要用到ob_start()以及PHP中的OB系列函数,这些函数可以做什么呢?
  第一就是静态模版技术。所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。
  代码示例:

  <?php
  ob_start();//打开缓冲区
  ?>
  php页面的全部输出
  <?php
  $content= ob_get_contents(); //取得php页面输出的全部内容
  $fp= fopen("output.html", "w"); //创建一个文件,并打开,准备写入
  fwrite($fp,$content); //把php页面的内容全部写入output.html,然后……
  fclose($fp);
  ?>

  当然这个ob系列函数还有其他很多用处我就不在这里一一说明了。
  2、apache输出控制
  将SendBufferSize设置为页面大小,这样就能将页面一次性放在发送缓冲区从而增加处理速度。
  SendBufferSize 指令
  说明:TCP发送缓冲区大小(字节)
  语法:SendBufferSize bytes
  默认值:SendBufferSize 0
  作用域:server config
  状态:MPM
  模块:beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker
  这个指令设置服务器的TCP发送缓冲区的大小(字节)。提高这个值会导致两个后果:高速度和高潜伏时间(100ms左右)。如果设置为"0",将使用操作系统默认值。
  通过源代码方式编译你的Apache/PHP/Database 可让你的程序增加10--15%的速度
  下面再说说在代码优化的时候应该注意的
  1、短代码不等于快的代码
  很多人在写程序时希望将代码写的越简洁越好,但是越短的代码有时候反而需要更长的执行时间,所以哪怕是用更多的代码也不使用速度慢的代码
  2、在写程序的时候更应该注重程序的扩展性,而不是追求速度
  3、在优化你的代码之前,先看看跟数据库有关的部分,因为大多数应用程序的瓶颈在数据库而不是代码
  4、微优化得不偿失
  什么叫做微优化?就像前面所说的将正则表达式部分的代码改用字符串函数代替。这样做有以下缺点:
  (1)花费时间较长
  (2)不会解决你的性能问题
  (3)很有可能会破坏以前的代码从而产生未知的错误
  (4)付出大于回报
  这里还不得不提到一个误区,有些人为了让程序更加优化,在分析业务逻辑的时候便将优化考虑在内了,从而为了得到更优的代码而改动业务逻辑。这是十分愚蠢的想法,因为程序的目的便是为了处理现实中遇到的问题,是为这些问题服务的,怎么能本末倒置呢。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-354499-1-1.html 上篇帖子: PHPRPC for PHP 读取数据 下篇帖子: ReflectionClass:PHP中的反射类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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