优化php代码 - 字符串echo输出 逗号也可作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绝非仅此一点,所谓学无止境,许许多多的优化方法和技巧,需要我们在实践中不断总结和运用。

上一篇:好代码是管出来的——使用Git来管理源代码


下一篇:键盘样式风格有关设置-iOS开发