php dvld.active 1,PHP的字符串
與C語言不同, php中有二種字符串,單引號的與雙引號的。。。
在php內部,使用單引號和使用雙引號,有什么區別呢?
把變量放到雙引號字符串中,與使用.進行字符串連接,哪種方式更省內存呢?
Vulcan Logic Disassembler介紹與安裝
Vulcan Logic Disassembler ,簡稱VLD。D也是Dumper的意思。
它是一個php的擴展(extension), 通過它可以看到PHP編譯之后的Opcode。
下載地址:
http://pecl.php.net/package/vld
作者的主頁: http://derickrethans.nl/projects.html#vld
xdebug也是此人所寫。
環境說明
php5.2.13安裝在了/home/modify/test/ 目錄中。
/home/modify/test/php-5.2.13/ 是PHP的源碼目錄。
php位于 /home/modify/test/bin/php
phpize位于 /home/modify/test/bin/phpize
php-config位于 /home/modify/test/bin/php-config
php.ini位于 /home/modify/test/lib/php.ini
php.ini中設置的extension_dir: extension_dir = “/home/modify/test/ext/”
下載vld
[
root@
masalife.com]
# cd /home/modify/test/php-5.2.13/ext
[
root@
masalife.com]
# svn co svn://svn.xdebug.org/svn/php/vld/trunk vld
編譯與安裝
[
root@
masalife.com]
# cd /home/modify/test/php-5.2.13/ext/vld
[
root@
masalife.com]
# /home/modify/test/bin/phpize
[
root@
masalife.com]
# ./configure --enable-vld --with-php-config=/home/modify/test/bin/php-config
[
root@
masalife.com]
# make
[
root@
masalife.com]
# cp modules/vld.so /home/modify/test/ext/
[
root@
masalife.com]
# vi /home/modify/test/lib/php.ini
在最后面加上 extension
=vld.so
這樣就安裝完畢了。可以看一下phpinfo,有沒有加載到 vld.so。
這個extension有二個參數:
vld.active 1表示啟用 0禁用
vld.execute 1運行代碼 0只顯示Opcode,不運行代碼
沒有必要把它們寫到php.ini中。恩,沒有必要。直接在命令行中指定就可以了。
使用vld
來看看下面的PHP代碼編譯成Opcode之后是什么樣子的:
雙引號的echo
echo
"huarong@masalife.com"
;
[
root@
masalife.com]
# /home/modify/test/bin/php -dvld.active=1 -dvld.execute=0 /tmp/aabi432o32.php
number of ops: 3
compiled vars: none
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ECHO OP1[
IS_CONST (
5959335
)
'huarong%40masalife.com'
]
4
1
>
RETURN OP1[
IS_CONST (
0
)
1
]
2
*
>
ZEND_HANDLE_EXCEPTION
op總數量3。
@被轉義成為 %40 。 和urlencode一樣的哈。
雙引號被轉化成為單引號了!!
單引號的echo
echo
'huarong@masalife.com'
;
[
root@
masalife.com]
# /home/modify/test/bin/php -dvld.active=1 -dvld.execute=0 /tmp/aabi432o32.php
number of ops: 3
compiled vars: none
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ECHO OP1[
IS_CONST (
11450330
)
'huarong%40masalife.com'
]
4
1
>
RETURN OP1[
IS_CONST (
0
)
1
]
2
*
>
ZEND_HANDLE_EXCEPTION
仍然是單引號。
雙引號字符串中的變量
$a
=
"modify"
;
echo
"huarong@masalife.com $a
"
;
[
root@
masalife.com]
# /home/modify/test/bin/php -dvld.active=1 -dvld.execute=0 /tmp/aabi432o32.php
number of ops: 7
compiled vars: !
0
= $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ASSIGN OP1[
IS_CV !
0
]
OP2[
, IS_CONST (
628503
)
'modify'
]
3
1
INIT_STRING RES[
IS_TMP_VAR ~1
]
2
ADD_STRING RES[
IS_TMP_VAR ~1
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CONST (
628186
)
'huarong%40masalife.com+'
]
3
ADD_VAR RES[
IS_TMP_VAR ~1
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CV !
0
]
4
ECHO OP1[
IS_TMP_VAR ~1
]
5
5
>
RETURN OP1[
IS_CONST (
0
)
1
]
6
*
>
ZEND_HANDLE_EXCEPTION
0 ASSIGN 是為$a賦值
之后的echo語句竟然變成了4行opcode:
INIT_STRING, ADD_STRING, ADD_VAR, ECHO。
INIT_STRING是初始化整個string
ADD_STRING是添加 “huarong@masalife.com ”
ADD_VAR是添加$a
ECHO就輸出了。
如果是 echo “huarong@masalife.com $a abc”
在ADD_VAR之后,還要再ADD_STRING “abc”。
number of ops: 8
compiled vars: !
0
= $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ASSIGN OP1[
IS_CV !
0
]
OP2[
, IS_CONST (
3396580
)
'modify'
]
3
1
INIT_STRING RES[
IS_TMP_VAR ~1
]
2
ADD_STRING RES[
IS_TMP_VAR ~1
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CONST (
3396263
)
'huarong%40masalife.com+'
]
3
ADD_VAR RES[
IS_TMP_VAR ~1
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CV !
0
]
4
ADD_STRING RES[
IS_TMP_VAR ~1
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CONST (
3396585
)
'+abc'
]
5
ECHO OP1[
IS_TMP_VAR ~1
]
5
6
>
RETURN OP1[
IS_CONST (
0
)
1
]
7
*
>
ZEND_HANDLE_EXCEPTION
如果字符串中有很多變量。。。想想就覺得郁悶。
字符串連接
$a
=
"modify"
;
echo
"huarong@masalife.com"
.
$a
;
[
root@
masalife.com]
# /home/modify/test/bin/php -dvld.active=1 -dvld.execute=0 /tmp/aabi432o32.php
number of ops: 5
compiled vars: !
0
= $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ASSIGN OP1[
IS_CV !
0
]
OP2[
, IS_CONST (
7277335
)
'modify'
]
3
1
CONCAT RES[
IS_TMP_VAR ~1
]
OP1[
IS_CONST (
7277018
)
'huarong%40masalife.com'
]
OP2[
, IS_CV !
0
]
2
ECHO OP1[
IS_TMP_VAR ~1
]
5
3
>
RETURN OP1[
IS_CONST (
0
)
1
]
4
*
>
ZEND_HANDLE_EXCEPTION
簡單了很多,字符串連接就是一個CONCAT,然后就ECHO了。
比起把變量放到字符串里面,字符串連接的速度更快啦。
關于這一點,在PHP文檔中也有提及:
Parsing variables within strings uses more memory than string concatenation.
When writing a PHP script in which memory usage is a concern,
consider using the concatenation operator (.) rather than variable parsing.
如果是多個字符串進行連接,如 echo “huarong@masalife.com “.$a.” abc”;
就會CONCAT多次:
number of ops: 6
compiled vars: !
= $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ASSIGN OP1[
IS_CV !
0
]
OP2[
, IS_CONST (
6217291
)
'modify'
]
3
1
CONCAT RES[
IS_TMP_VAR ~1
]
OP1[
IS_CONST (
6216973
)
'huarong%40masalife.com+'
]
OP2[
, IS_CV !
0
]
2
CONCAT RES[
IS_TMP_VAR ~2
]
OP1[
IS_TMP_VAR ~1
]
OP2[
, IS_CONST (
6217296
)
'+abc'
]
3
ECHO OP1[
IS_TMP_VAR ~2
]
5
4
>
RETURN OP1[
IS_CONST (
0
)
1
]
5
*
>
ZEND_HANDLE_EXCEPTION
另外一種連接字符串的方式
使用逗號也可以的!
$a
=
"modify"
;
echo
"huarong@masalife.com"
,
$a
;
[
root@
masalife.com]
# /home/modify/test/bin/php -dvld.active=1 -dvld.execute=0 /tmp/aabi432o32.php
number of ops: 5
compiled vars: !
0
= $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2
0
>
ASSIGN OP1[
IS_CV !
0
]
OP2[
, IS_CONST (
3686782
)
'modify'
]
3
1
ECHO OP1[
IS_CONST (
3686464
)
'huarong%40masalife.com'
]
2
ECHO OP1[
IS_CV !
0
]
5
3
>
RETURN OP1[
IS_CONST (
0
)
1
]
4
*
>
ZEND_HANDLE_EXCEPTION
可以看到,使用逗號連接字符串就相當于echo了多次。。。
不過逗號只有在echo的時候可以用,print就不支持它了。
由于它沒有用到CONCAT字符串操作,應該會更加節省內存。
總結
以上是生活随笔為你收集整理的php dvld.active 1,PHP的字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libcoredb.class.php,
- 下一篇: 小米拨号键不见了怎么恢复(小米官方售后服