PHP使用vld擴充套件檢視opcodes

2021-10-14 09:45:44 字數 3782 閱讀 5661

php使用vld擴充套件檢視opcodes

需要分析php**的效能,或者說實現同樣功能的**到底哪個更好呢?或者說想知道底層的實現可以使用vld檢視opcode。

該擴充套件以收錄在 pecl

修改 php.ini,增加extension=php_vld.dll

php -m

簡單使用vld

**

<?php

echo1+

2;

執行

$ php -dvld.active=

1 test.php

finding entry points

branch analysis from position:

01 jumps found.

(code =

62) position 1=-

2filename: d:\dev\php\my\test

.php

function name:

(null

)number of ops:

2compiled vars: none

line #* e i o op fetch ext return operands

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-----40

0 e >

echo31

>

return

1branch:

# 0; line: 40- 40; sop: 0; eop: 1; out0: -2

path #1: 0,

3

使用vld對比**執行過程

比如有兩個寫法

寫法一:

<?php$a=

'a';$b=

'b';$c=

'c';

echo$a.

$b.$c;

其opcodes為

finding entry points

branch analysis from position:

01 jumps found.

(code =

62) position 1=-

2filename: d:\dev\php\my\test

.php

function name:

(null

)number of ops:

7compiled vars:!0

=$a,!

1=$b,

!2=$c

line #* e i o op fetch ext return operands

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-----40

0 e >

assign!0

,'a'411

assign!1

,'b'422

assign!2

,'c'443

concat~6

!0,!

14concat~7

~6,!

25echo~7

6>

return

1branch:

# 0; line: 40- 44; sop: 0; eop: 6; out0: -2

path #1: 0,

abc

寫法二:

<?php$a=

'a';$b=

'b';$c=

'c';

echo$a,

$b,$c;

其opcodes為

finding entry points

branch analysis from position:

01 jumps found.

(code =

62) position 1=-

2filename: d:\dev\php\my\test

.php

function name:

(null

)number of ops:

7compiled vars:!0

=$a,!

1=$b,

!2=$c

line #* e i o op fetch ext return operands

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-----40

0 e >

assign!0

,'a'411

assign!1

,'b'422

assign!2

,'c'443

echo!0

4echo!1

5echo!2

6>

return

1branch:

# 0; line: 40- 44; sop: 0; eop: 6; out0: -2

path #1: 0,

abc

我們知道字串都是不可變的,針對字串的操作都是會重新分配新的的記憶體。顯然方法二更合理,這裡只是列舉簡單的例子說明vld在優化**上的可操作性。

line為檔案行號,此處40是因為前面有注釋的**沒拷貝過來。

#*為 opcode 編號。

!0編譯的變數,也叫 cv,以!開頭表示,compiled vars: !0 = $a, !1 = $b, !2 = $c

~6臨時變數,以~開頭,比如上面的~6, ~7

可以在某個具體的點上使用vld來對比opcodes,找到可以優化的方式。

如何閱讀 opcodes 可以看看

vld的配置

PHP7 2安裝vld擴充套件

這裡解壓至建立的vld資料夾 這裡要找準自己開發機phpize的位置 usr local matrix bin phpize 找準自己開發機上php config的位置 找準php.ini的位置,在末尾新增 extension vld.so 即可 vim usr local matrix lib p...

使用php指令碼檢視已開啟的擴充套件

php安裝時會將擴充套件包編譯進去,對於乙個正在執行中的資料庫,檢視php的擴充套件開啟狀況,第一種方式是通過配置檔案檢視,另外是通過phpinfo函式檢視所有的配置,另外是使用php內建函式來檢視,通過指令碼輸出來檢視,如下 print r get loaded extensions 通過get ...

使用C語言來擴充套件PHP,寫PHP擴充套件dll

以前寫過一次php擴充套件dll,那個是利用呼叫系統的com口實現的擴充套件,與php不能真正融合。心血來潮,研究了一下php的原始碼,網上找了一些資料,自己嘗試寫了乙個擴充套件dll,測試沒問題。下面記錄一下具體擴充套件方法 3 把vc 6.0安裝目錄中的 microsoft visual stu...