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

[经验分享] 优化php代码

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-30 16:35:01 | 显示全部楼层 |阅读模式
  2016年12月12日10:00:16
  ======================
  网页访问速度的提升,是可以通过代码的优化来实现的。代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行效率,看其消耗CPU和内存的多少。例如Facebook近来就宣布通过代码优化而将网站性能提高了一倍,平均访问时间从5s降至2.5s,这个结果无疑是极其诱人的。
  PHP是一门很多人正在使用的语言,在网站开发上PHP的使用广泛度超过ASP和ASP.NET,看看时下流行的CMS和博客用什么语言来开发的就知道了。
  其实PHP入门很容易,尤其是对于一个已经接触过程序编写的人来说,而对于没有接触过程序语言的菜鸟来说,学习用PHP做一个输出hello world的网页也很轻松。
  然而要编写高效率的代码,并不是所有懂程序的人都可以编写出来的,这需要经过多年的研究积累和经验总结。
  本文将给大家提炼一些PHP代码优化的实例,利用这些优化,PHP代码的运行能力将会大大提高,速度提升5倍以上有些情况下并不是不能出现。
  1、echo 比 print 快
  echo和print是PHP程序中经常使用的指令,尤其是需要调试的时候。echo和print都能输出一段信息,但经测试发现,echo运行速度会比print快,因此在程序编写是应使用echo而非print。但是有时候也需要用到print,echo不能完全代替print。请看php echo()和print()有什么区别。
  2、连接符用逗号而不是句号
  php里逗号和句号都可以起到连接符的作用,关于如何优化输出,可以看这里如何优化php字符串echo输出。
  此外,输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。
  ---------------------------------------
  如下4种方式,都能得到同样的结果,但是,只有第4种方式是最好的。

  • $foo = 'John SMITH';
  • echo "Hello $foo, welcome on my website.";
  • echo "Hello " . $foo . " welcome on my website.";
  • echo 'Hello ' . $foo . ' welcome on my website.';
  • echo 'Hello ', $foo , ' welcome on my website.';
  我敢肯定你们都知道echo '$foo'是不会工作的,但是,我十分肯定的告诉你,那就是使用双引号去显示一个简单的信息,那是非常不好的。
  让我们开始吧。第一个不能运行(第二个也一样),因为使用双引号会强制php为此字符串寻找替换值。
  第二个好一些,因为php没有替换需要执行的。
  第三个更好,因为使用了单引号,因此语言知道你能够脱离进程传送文本,但是“不好”的事情是使用了连接符(不操作,就行第二个例子一样)。
  最后一个使用了单引号,并且加了一个连接符。为什么这样处理最好呢?
  好吧,让我们看看当使用第三种方法时会发生什么。
  php创建一个字符串,包含“Hello”,然后扩充它,加上foo变量(“John SMITH”),然后,再次扩充它,加上“Welcome on my website.”语句,然后,echo能使用它。
  然而第四个例子,echo唯一做的一件事是发送“Hello”,接着输出$foo的内容,再输出“Welcome on my website.”。因为echo仅仅是发送文本而没有创建一个需要扩充内容的字符串。
  创建一个基准测试后结果如下:
  0.0022029876709
  0.00211095809937
  0.00213599205017
  0.00551700592041
  第四种方法的执行速度最慢。
  从这篇文章,我们应该明白如何优化php字符串连接符,从而提高程序运行速度。
  你知道吗?“,”逗号也可作php连接符
  在上述第四个例子里,发现原来“,”逗号也可作php的连接符的,我们大家一般都是使用一点“.”作连接符的。
  据说,这可能是从C开始带过来的习惯,printf这类的输出都是变参的,echo也继承了这个优良传统。不过需要明白的是,这里的逗号是参数间隔符,不是字符串连接符。
  ------------------------------------
  再来个,逗号与句号的区别
  echo $str,$str2,$str3;
  使用逗号进行运算是逐个输出运算结果
  而
  echo $str.$str2.$str3;
  使用点号是先对所有字符串进行运算得到结果再输出。
  这样看当然是 逗号的效率比点号高。 因为逗号连接是不需要运算的。
  ------------------------------
比如:  1. echo 'abc'.'def'; //用点号连接字符串
  2. echo 'abc','def'; //用逗号连接字符串
  也许很多人都知道逗号要比点号快.但是不知道为什么.更不知道这两者到底有什么区别.
  那么下面我们就举一些例子.来认清楚他们之前的区别.
  1. echo '1+5=' . 1+5;
  看看上面的.输出的结果是6..而不是1+5=6.有些神奇吧?
  更神奇的是你看下面的例子.
  1. echo "1+5=" . 5+1; //输出2
  结果十分奇怪.我们看到.我们把5和1换下位置.结果就变成2了.
  为什么会这样.难道在PHP中加法是没有交换律的?当然不是..
  我们先不去想为什么.如果我把上面的点号换成逗号试下.
  1. echo '1+5=' , 5+1; //输出 1+5=6
  2. echo '1+5=' , 1+5; //输出 1+5=6
  可以看出.只有使用逗号我们才可以得到意料中的结果.
  那为什么点号就不行呢?逗号为什么就行呢?
  1. echo ('1+5' . 5)+1; //输出2 ,这里字符串转化成整形是 1 ,所以1+1等于2了,php运算类型会自动转换
  我们给前面的加个括号后.得到的结果是一样的.证明PHP是先连接字符串再进行加法计算了.按照从左向右的方向进行的.
  那么好.既然是先连接的字符串.那么就应该是"1+55"了.然后再用这个字符串加上1.那为什么就会输出2呢?
  这个跟PHP中字符串变成数字的机制是相关的.我们来看下面的例子
  1. echo (int)'abc1'; //输出0
  2. echo (int)'1abc'; //输出1
  3. echo (int)'2abc'; //输出2
  4. echo (int)'22abc'; //输出22
  从上面的例子我们可以看出.如果将一个字符串强制转换成一个数字.PHP会去搜索这个字符串的开头.如果开头是数字就转换.如果不是就直接返回0.
  回到刚才的1+55.既然这个字符串是1+55.所以强制类型转换后就应该是1了.在此基础上加1.当然是2了.
  为了证明我们的猜想.我们来验证一下.
  1. echo '5+1=' . 1+5; //输出10
  2. echo '5+1=' . 5+1; //输出6
  3. echo '1+5=' . 1+5; //输出6
  4. echo '1+5=' . 5+1; //输出2
  结果证明.我们的设想是正确的.
  那么为什么使用逗号就没有上面的问题了呢?
  手册上说了.用逗号是multiple parameters.
  也就是说是多参数.换句话说.
  逗号分隔开的就相当于是N个参数.也就是说把echo当个函数用.
  这样的话.echo会对每个参数先进行计算.最后再进行连接后输出.所以我们用逗号就不存在上面的问题了
  3、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
  这条准则同样适用于任何语言,这个是编程习惯,但这个习惯很不好,不管你使用什么语言。
  // 在每次循环中sizeof函数都要被调用

  for ($i = 0; $i <>  {
  do_something();
  }
  // 您可以在循环起始部分对这个不变的量赋值

  for ($i = 0, $size =>  {
  do_something();
  }
  4、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
  if else if 的使用非常普遍,在其他语言里也一样,这个写法好像更符合人的说话习惯,但是在程序里这样写并不太好,它在效率上比switch case要低。所以,一旦程序里需要多个判断时,就应该用switch case而不要再用if else if else if这样。
  5、数据库连接当使用完毕时应关掉
  在操作数据库时,很多程序员往往忘记关掉数据库连接,或许他们没有这个习惯。数据库连接是需要消耗内存为代价的,连接数越多内存消耗就越多,所以在实际应用中都必须及时关闭不需要用到的连接,以释放内存,缓解服务器压力。
  6、错误消息代价昂贵
  错误消息一般用于调试,它的执行效率其实是很低的,速度上会比直接运行慢很多。所以,在程序不需要抓取错误消息时,就不要用。
  7、局部变量要合理使用
  尽量不要在for循环中使用函数,比如for ($x=0; $x prop++)要比递增一个局部变量慢3倍。
  递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
  仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
  8、用单引号代替双引号来包含字符串
  实践证明,用单引号代替双引号来包含字符串,这样做会更快一些。
  因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。更多分析请看实例分析php单引号和双引号的区别。
  9、mod_zip你用了吗
  mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
  10、缓存的使用
  除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
  尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
  11、网页用html而非php
  毫无疑问,html静态页面的访问速度是最快的,现在的CMS,都是可以在后台生成全站HTML静态页面的,这不仅可以提高用户访问网页的速度,而对于搜索引擎的收录和排名也是非常有利的。
  以上几点是本文提炼出来的PHP优化方法,当然,优化PHP绝非仅此一点,所谓学无止境,许许多多的优化方法和技巧,需要我们在实践中不断总结和运用。

运维网声明 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-429725-1-1.html 上篇帖子: 记因PHP的内存溢出导致的事故之解决 下篇帖子: CURL PHP模拟浏览器get和post
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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