先上大神文章54chen

里面提到了echo 字符串用,比用.连接要好。原因先不说,先来看以下两句

 <?php
 // 逗号比.更节省时间?
  echo '1+5=' . 1+5; 
  echo '1+5=' . 5+1;

结果是什么?
1+5=6?
1+5=6?
——————
6?
2?
——————
6.6?
6.6?
——————
我只能说echo '5+1=' . 1+5;的结果是10,所以结果是62.

php echo manual

<?php
// Strings can either be passed individually as multiple arguments or
// concatenated together and passed as a single argument
echo 'This ', 'string ', 'was ', 'made ', 'with multiple parameters.', chr(10);
echo 'This ' . 'string ' . 'was ' . 'made ' . 'with concatenation.' . "\n";

至于为啥快,可以简单理解,用.是先拼接在echo,虽然逗号个数代表echo的调用次数(可以这么理解暂时)。
但是拼接的速度要小于echo的速度。
如果深入理解,VLD如下图。是@tywei大神的图
图片描述

上面比下面多了个CONCAT,下面比上面多了个echo。
如果想知道更多详细信息,点击查看这个重磅炸弹

=======更新分割线===================2016-05-27
今天在看java的时候,发现java的string对象很严谨,小例子如下

public class HelloWorld {
    public static void main(String[] args) {
        String s1 = "imooc";
        String s2 = "imooc";
        String s3="I love "+s1; 
        
        //定义字符串s3,保存“I love”和s1拼接后的内容
         
        
        // 比较字符串s1和s2
        // imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
        System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
        
        //比较字符串s1和s3
        System.out.println("s1和s3内存地址相同吗?" +    (s2==s3)             );

        String s4 = "I love " + s1;
         //比较字符串s4和s3
        // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
        System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
    }
}

以上的结果为
s1和s2内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
暂不讨论内存地址这个概念(其实我不大懂),我就想起了php中是不是也是这样。
类似例子就不贴了,php肯定是全等的。。但是我又想到了怎么看php中内存具体怎么调用,想到了c下的gdb。但是php还是解析不了。那先看看opcode,然后就有这篇补上的文章了。

我们先安装个vld扩展,先声明我环境为14.04 LTS PHP 5.5.9-1ubuntu4.16 (cli)
pecl下载vld

tar zxvf解压

进入到解压好目录

phpize 
./configure 
make && make install 

(注意操作要在root下,要不会报perssion错误)

root@tb:/home/tb/Downloads/vld-0.13.0# ls /usr/lib/php5/20121212/
json.so    memcached.so  mysql.so    pdo_mysql.so  readline.so  vld.so
mcrypt.so  mysqli.so     opcache.so  pdo.so        redis.so     xhprof.so

这样就装好了。

====修改fpm下的配置文件

vim /etc/php5/fpm/php.ini

增加一行vld的,如下所示

[redis]
extension =redis.so
[xhprof]
extension=xhprof.so
[vld]
extension=vld.so
xhprof.output_dir=/var/log/xhprof
[memcache]
extension =memcached.so

重启fpm

service php5-fpm stop
service php5-fpm start

可以看到web中的phpinfo有了vld的选项。

vld support    enabled

为啥说是web中呢,因为我们一般调试在cli端
所以需要修改下cliphp.ini文件

执行php -m |grep vld

root@tb:/usr/share/nginx/html/vldtest# php -m |grep vld
vld

就说明cli下的vld也可以用了。

然后我们在具体目录建两个php文件,内容如下

root@tb:/usr/share/nginx/html/vldtest# cat 1.php 
<?php
echo "hello"." "."world";?>
root@tb:/usr/share/nginx/html/vldtest# cat 2.php 
<?php
echo "hello"," ","world";?>
root@tb:/usr/share/nginx/html/vldtest# 

然后分别执行

php -dvld.active=1 1.php 

root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 1.php 
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /usr/share/nginx/html/vldtest/1.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   CONCAT                                           ~0      'hello', '+'
         1        CONCAT                                           ~1      ~0, 'world'
         2        ECHO                                                     ~1
   3     3      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     3; out1:  -2
path #1: 0, 
hello world

php -dvld.active=1 2.php 

root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 2.php 
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /usr/share/nginx/html/vldtest/2.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ECHO                                                     'hello'
         1        ECHO                                                     '+'
         2        ECHO                                                     'world'
   3     3      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     3; out1:  -2
path #1: 0, 
hello world

下面简单记录下参数意义:
-dvld.active 是否再执行时激活vld,默认为0.所以我们都使用-dvld.active=1启用
-dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件,默认为0,就是禁用。
就是不跳过
-dvld.execute 是否执行php脚本,默认为1,所以上面都显示了helloworld
-dvld.save_paths 指定是否输出文件
再膜拜下大神关于vld的文章

另外感兴趣的同学关于扩展可以执行下 php --re vld【redis,memcache】


牙小木木
1.5k 声望80 粉丝

iamtb.cn