必威的官网网络

当前位置:必威的官网-必威体育 > 必威的官网网络 > 或者说实现同样功能的代码到底哪个更好呢

或者说实现同样功能的代码到底哪个更好呢

来源:http://www.jlqfjt.com 作者:必威的官网-必威体育 时间:2019-06-28 15:14

内需解析PHP代码的性质,或然说完成平等遵守的代码到底哪些越来越好啊?也许说想知道底层的完结能够运用VLD查看opcode

下载与安装VLD

# wget
# tar zxvf vld-0.11.2.tgz
# cd ./vld-0.11.2
# /usr/local/php/bin/phpize              或许直接phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
# make && make install


编纂php.ini文件激活vld扩大:

php.ini位置

#cd /usr/local/php/lib

增加
extension=vld.so

 

重启Apache:
# /usr/local/apache2/bin/apachectl restart
--------------------------------- 

查看phpinfo()信息

图片 1

 


迄今结束,VLD就安装完了。写个大约的test.php

[php] view plaincopy

  1. $a='123';   
  2. echo $a;  

 

 

# php -dvld.active=1 ./test.php

若果未有设置php情形变量的话

#/usr/local/php/bin/php  -dvld.active=1  test.php

查阅结果

图片 2

 

如上为VLD输出的PHP代码生成的中间代码的新闻,表明如下:

  • Branch analysis from position 那条音信多在条分缕析数组时使用。
  • Return found 是或不是再次回到,那个大约有皆有。
  • filename 深入分析的文件名
  • function name 函数名,针对种种函数VLD都会生成一段如上的单身的音讯,这里显妥善前函数的称呼
  • number of ops 生成的操作数
  • compiled vars 编写翻译时期的变量,那么些变量是在PHP5后增加的,它是三个缓存优化。那样的变量在PHP源码中以IS_CV标记。
  • op list 生成的中间代码的变量列表

使用-dvld.active参数输出的是VLD暗中认可设置,倘若想看尤其详实的内容。能够利用-dvld.verbosity参数。

 

#php -dvld.active=1 -dvld.verbosity=3 text.php

-dvld.verbosity=3是VLD在时下版本能够显得的最详尽的信息.

若是大家只是想要看输出的中间代码,并不想进行这段PHP代码,能够利用-dvld.execute=0来剥夺代码的施行

#php -dvld.active=1 -dvld.execute=0 text.php

 

VLD扩充的参数列表:

  • -dvld.active 是或不是在实行PHP时激活VLD挂钩,默以为0,表示禁止使用。能够使用-dvld.active=1启用。
  • -dvld.skip_prepend 是或不是跳过php.ini配置文件中auto_prepend_file钦定的文本, 默感到0,即不跳过含有的公文,展现那一个富含的文件中的代码所生成的中间代码。此参数生效有几个前提条件:-dvld.execute=0
  • -dvld.skip_append 是或不是跳过php.ini配置文件中auto_append_file钦点的公文, 默以为0,即不跳过含有的文件,展现这几个包涵的文件中的代码所生成的中间代码。此参数生效有三个前提条件:-dvld.execute=0
  • -dvld.execute 是不是实行这段PHP脚本,私下认可值为1,表示实践。能够动用-dvld.execute=0,表示只展现中间代码,不推行生成的中间代码。
  • -dvld.format 是否以自定义的格式呈现,暗中认可为0,表示否。能够选取-dvld.format=1,表示以团结定义的格式显示。这里自定义的格式输出是以-dvld.col_sep钦赐的参数间隔
  • -dvld.col_sep 在-dvld.format参数启用时此函数才会使得,私下认可为“t”。
  • -dvld.verbosity 是不是出示更详细的音讯,默以为1,其值可以为0,1,2,3 其实比0小的也足以,只是效果和0同样,譬喻0.1之类,可是负数除了这么些之外,负数和功用和3的效益同样比3大的值也是足以的,只是效果和3同一。
  • -dvld.save_dir 内定文件输出的路线,私下认可路线为/tmp。
  • -dvld.save_paths 调控是还是不是输出文件,默以为0,表示不出口文件
  • -dvld.dump_paths 调控输出的内容,现在唯有0和1三种状态,默以为1,输出内容

 

利用VLD相比较代码差距

代码text1.php

[php] view plaincopy

  1. $var = 111;  
  2. $str = "AAA " . $var . " BBB";  

代码text2.php

[php] view plaincopy

  1. $var = 111;  
  2. $str = "AAA $var BBB";  

图片 3

从结果很清晰的观看第一段代码比第二段代码多了concat

第八个一连操作,将“test string begin ”和$var连接起来,获得“AAA 111”,然后再实行第二个延续操作,将上二个操作获得的结果“AAA 111”和” BBB”连接起来,并将结果存款和储蓄在另三个一时变量,最终将第一个三番五次操作的结果赋值给$str。

连年操作对应的opcode为ZEND_CONCAT,对于所给的多个操作数,其最后经过concat_function函数将八个字符串连接起来,假若所给的变量的品类不是字符串,则会经过zend_make_printable_zval将其调换到字符串。concat_function函数会基于多少个字符串的长短重新分配内存,并进行五遍拷贝操作,将三个字符串拷贝到新的内部存款和储蓄器空间。这里针对四个字符串同样的情事有三个非常管理。

[cpp] view plaincopy

  1. if (result==op1) {  /* special case, perform operations on result */  
  2.     uint res_len = Z_STRLEN_P(op1)   Z_STRLEN_P(op2);  
  3.    
  4.     Z_STRVAL_P(result) = erealloc(Z_STRVAL_P(result), res_len 1);  
  5.    
  6.     memcpy(Z_STRVAL_P(result) Z_STRLEN_P(result), Z_STRVAL_P(op2), Z_STRLEN_P(op2));  
  7.     Z_STRVAL_P(result)[res_len]=0;  
  8.     Z_STRLEN_P(result) = res_len;  
  9. } else {  
  10.     Z_STRLEN_P(result) = Z_STRLEN_P(op1)   Z_STRLEN_P(op2);  
  11.     Z_STRVAL_P(result) = (char *) emalloc(Z_STRLEN_P(result)   1);  
  12.     memcpy(Z_STRVAL_P(result), Z_STRVAL_P(op1), Z_STRLEN_P(op1));  
  13.     memcpy(Z_STRVAL_P(result) Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));  
  14.     Z_STRVAL_P(result)[Z_STRLEN_P(result)] = 0;  
  15.     Z_TYPE_P(result) = IS_STRING;  
  16. }  

而直接在字符串中插入变量,其具有的操作都以加多操作,将字符串增多到再次来到值,将变量加多到重临值,
具有的结果回到都以在三个一时变量中,如大家的言传身教,首先会将”AAA “增多到一时变量,然后将暂且变量和$var变量增添到有时变量,之后将不经常变量和” BBB”增多到有的时候变量,最终将此此时变量赋值给$str。这里丰盛将字符串加多到有时变量,其对应的opcode为ZEND_ADD_ST奥迪Q5ING,将变量增多到临时变量,其对应的opcode为ZEND_ADD_VA凯雷德,即使那三个操作的opcode差异,但其最终调用都是add_string_to_string,他们所例外的调用此函数的第三个参数,四个是操作码存款和储蓄的ZVAL变量,二个是透过改换列表获取的ZVAL变量。

假若认为供给看C语音级其他php源码,能够参见:使用strace查看C语言级其余php源码

万一你要翻开memcpy能够去那么些网址

搜寻结果在:

图片 4

========================

延长阅读参照他事他说加以考察:

PHP中的字符串连接操作


本文由必威的官网-必威体育发布于必威的官网网络,转载请注明出处:或者说实现同样功能的代码到底哪个更好呢

关键词: 必威betway

上一篇:bootstrap里面有个激活按钮的时候

下一篇:没有了