開發中需要性能調優,使用xdebug分析thinkphp框架函數調用圖。
關於xdebug的安裝參考這2篇
NetBeans配置Xdebug 遠程調試PHP
php擴展xdebug安裝以及用kcachegrind系統分析
1.安裝xdebug
需要先去http://www.xdebug.org看看一些文檔,xdebug作為php擴展安裝
# http://www.xdebug.org/files/xdebug-2.3.3.tgz
# tar -xzf xdebug-2.3.3.tgz
# cd xdebug-2.3.3
# /usr/local/php/bin/phpize
# ./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-config
# make && make install
2.給權限
# mkdir -p /tmp/xdebug
# chmod 755 /tmp/xdebug
# chown nobody:nobody /tmp/xdebug
3.修改php配置
修改php.ini文件
[Xdebug]
zend_extension=xdebug.so
xdebug.profiler_enable=on
xdebug.trace_output_dir=/tmp/xdebug
xdebug.profiler_output_dir=/tmp/xdebug
4.重啟php-fpm
# killall php-fpm
# /etc/init.d/php-fpm
5.運行PHP產生日志
配置好之後,運行php文件就會在/tmp/xdebug下生成類似這樣的日志文件
-rw-r--r-- 1 nobody nobody 4615252 Oct 27 17:31 cachegrind.out.29293
6.使用kcachegrind圖形化分析日志
windows port of kcachegrind
每一步函數調用看的很清晰:
問題最嚴重就是出在execute,其實也就是大量的SQl查詢。called就是函數調用次數。
優化辦法很多,使用memcached或者直接使用thinkphp自帶的各自緩存,這個是優化後的圖,明顯看出called少了。
查詢緩存
http://document.thinkphp.cn/manual_3_2.html#query_cache
對於及時性要求不高的數據查詢,我們可以使用查詢緩存功能來提高性能,而且無需自己使用緩存方法進行緩存和獲取。
查詢緩存功能支持所有的數據庫,並且支持所有的緩存方式和有效期。
在使用查詢緩存的時候,只需要調用Model類的cache方法,例如:
1.$Model->cache(true)->where('status=1')->select();
SQL解析緩存
http://document.thinkphp.cn/manual_3_2.html#sql_build_cache
除了查詢緩存之外,ThinkPHP還支持SQL解析緩存,因為ThinkPHP的ORM機制,所有的SQL都是動態生成的,然後由數據庫驅動執行。
所以如果你的應用有大量的SQL查詢需求,那麼可以開啟SQL解析緩存以減少SQL解析提高性能。要開啟SQL解析緩存,只需要設置:
1.'DB_SQL_BUILD_CACHE' => true,
即可開啟數據庫查詢的SQL創建緩存,默認緩存方式為文件方式,還可以支持xcache和apc方式緩存,只需要設置:
1.'DB_SQL_BUILD_QUEUE' => 'xcache',
我們知道,一個項目的查詢SQL的量可能會非常巨大,所以有必要設置下緩存的隊列長度,例如,我們希望SQL解析緩存不超過20條記錄,可以設置:
1.'DB_SQL_BUILD_LENGTH' => 20, // SQL緩存的隊列長度。
How profilers lie: the cases of gprof and KCachegrind
為 PHP 應用提速、提速、再提速!,第 2 部分: 分析 PHP 應用程序以查找、診斷和加速運行緩慢的代碼