當程式寫完後, 發現整頁跑起來速度有點慢, 要追蹤分析是哪邊是造成速度慢的主因, 通常最簡單的方法, 是用 microtime() (可見此文: PHP 測量程式執行時間)來把每個 Function 包起來, 分別看執行時間.
如果太多要追蹤, 懶得這樣子包來包去, 另外一種就是用 PHP Profiling 的工具(APD)來做, 詳可見下述:
不過, 太久沒用這工具, 沒想到 APD 從 2008年到現在(2011), 都沒有新版, 使用 Pecl 安裝, 也無法直接安裝完成, 在此順便把解法紀錄於此.
PHP APD 安裝 與 問題排除
- sudo apt-get install php-pear # 有 /usr/bin/pecl
- sudo apt-get install re2c # apd compile 需要
- sudo pecl search apd # http://pecl.php.net/package/apd
- sudo pecl install apd # 安裝失敗, 出現下述錯誤
make: *** [php_apd.lo] Error 1
解法
- 詳見: Debian PHP 5.3 APD compile problems
- sudo pecl download apd
- tar xvf apd-1.0.1.tgz
- cd apd-1.0.1/
- vim php_apd.c
# 第 967 行
GC(extended_info) = 1;
改成
CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO; - phpize
- ./configure
- make
- make test
- sudo make install
Installing shared extensions: /usr/lib/php5/20090626/
- sudo cp pprofp /usr/bin/ # pprofp 是用來分析 profiling 完成後的檔案用
PHP APD 設定
- vim /etc/php5/conf.d/apd.ini
zend_extension = /usr/lib/php5/20090626/apd.so
apd.dumpdir = /tmp
apd.statement_trace = 0
PHP APD 使用 與 測試
APD 使用方式很簡單, 只要在要 trace 的 script 上面, 加上 "apd_set_pprof_trace();" 就可以了, 詳可見下述範例.
- vim script.php # 需在要 trace 得程式上面加上 "apd_set_pprof_trace();"
<?php
apd_set_pprof_trace();//rest of the script
$a = '2001-03-01 11:11:12';
echo substr($a, 0, 4);
echo substr($a, 5, 2);
echo substr($a, 8, 2);
?> - php -e -f script.php # 也可以直接 php script.php 即可, 會產生類似如此的檔案: "/tmp/pprof.xxxxx"
PHP APD 分析
PHP APD 的 pprofp 請依照自己所需要的參數使用, 會出現類似下述的分析結果.
- pprofp -u /tmp/pprof.25802
- pprofp -t /tmp/pprof.15507
Trace for /tmp/script.php
Total Elapsed Time = 0.01
Total System Time = 0.00
Total User Time = 0.00
Real User System secs/ cumm
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name
--------------------------------------------------------------------------------------
0.0 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 0 substr
0.0 0.01 0.01 0.00 0.00 0.00 0.00 1 0.0000 0.0000 0 apd_set_pprof_trace
0.0 0.00 0.01 0.00 0.00 0.00 0.00 1 0.0000 0.0000 0 main