• 优化php代码


     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 < sizeof($post_data); $i++)
       {
            do_something();
       }
    // 您可以在循环起始部分对这个不变的量赋值
       for ($i = 0, $size = sizeof($post_data); $i < $size; $i++)
       {
            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绝非仅此一点,所谓学无止境,许许多多的优化方法和技巧,需要我们在实践中不断总结和运用。

  • 相关阅读:
    Ckeditor事件绑定
    Linux使用netstat命令查看并发连接数
    memcached 常用命令及使用说明
    Linux(Ubuntu)下面SecureCRT 完全破解
    Linux下用SCP无需输入密码传输文件
    Java的URL类(一)
    java编码与解码(一)
    IDEA破解
    linux查看日志文件命令
    springboot +mybatis 搭建完整项目
  • 原文地址:https://www.cnblogs.com/942267027wzmblog/p/6163333.html
Copyright © 2020-2023  润新知