- 相關(guān)推薦
PHP前端開發(fā)中的性能
有平常心,就會有最佳的發(fā)揮;懷自信心,便能跨越每一個障礙。。以下是小編為大家搜索整理的PHP前端開發(fā)中的性能,希望能給大家?guī)韼椭?更多精彩內(nèi)容請及時關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!
在我們平時的php開發(fā)中,一個大的項目經(jīng)過長時間的積累以后你會發(fā)現(xiàn)性能越來越慢,而性能到底消耗在了什么地方,常常是一個令人頭疼的問題,function a()調(diào)用了多少次,function b()又消耗了多少時間,我們到底怎么查找是哪個蛀蟲拉慢了我們的程序運行速度呢?在這里給大家介紹一款工具xdebug,相信很多人已經(jīng)聽說過了,希望借助這個工具我們可以起到簡單分析php程序性能瓶頸的問題。
A)假設(shè)1,假設(shè)用戶目錄在/home/ad
B)假設(shè)2,假設(shè)php目錄在/home/ad/php
1、xdebug簡介與安裝
Xdebug是一個開放源代碼的PHP程序調(diào)試器(即一個Debug工具),可以用來跟蹤,調(diào)試和分析PHP程序的運行狀況。
1)下載xdebug
xdebug的官方下載地址為:http://xdebug.org/download.php
最新版本為:Xdebug 2.1.0
2)xdebug的安裝
1
2
3
4
5
6
7
8
|
cd /home/ad
wget http://xdebug.org/files/xdebug-2.1.0.tgz
tar -zxvf xdebug-2.1.0.tgz
cd xdebug-2.1.0
/home/ad/php/bin/phpize
./configure --enable-xdebug --with-php-config=/home/ad/php/bin/php-config
make
make install
|
安裝完以后會提示你擴展安裝到了哪個目錄,類似 /home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/
假設(shè)你的php.ini放在 /home/ad/php/lib/php.ini
加上
1
2
3
4
5
6
7
8
9
|
[xdebug]
zend_extension = "/home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.auto_trace = on
xdebug.auto_profile = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.trace_output_dir = "/home/ad/xdebug_log"
xdebug.profiler_output_dir = "/home/ad/xdebug_log"
|
重啟apache
去/home/ad/xdebug_log下看看是不是日志已經(jīng)出來了
2、xdebug參數(shù)簡介
zend_extension 加載xdebug擴展
xdebug.auto_trace 自動打開打開函數(shù)調(diào)用監(jiān)測
xdebug.auto_profile 自動打開性能監(jiān)測
xdebug.trace_output_dir 設(shè)定函數(shù)調(diào)用監(jiān)測信息的輸出文件的路徑。
xdebug.profiler_output_dir 設(shè)定效能監(jiān)測信息輸出文件的路徑。
xdebug.collect_params 打開收集“函數(shù)參數(shù)”的功能。將函數(shù)調(diào)用的參數(shù)值列入函數(shù)過程調(diào)用的監(jiān)測信息中。
xdebug.collect_return 打開收集“函數(shù)返回值”的功能。將函數(shù)的返回值列入函數(shù)過程調(diào)用的監(jiān)測信息中。
3、示例程序與日志收集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
function a()
{
echo "aaa";
}
function b()
{
a();
sleep(1);
a();
sleep(1);
a();
}
b();
?>
|
4、日志分析工具wincachegrind
http://sourceforge.net/projects/wincachegrind/
不用安裝直接雙擊就可以打開了
我們用它打開剛才收集的日志cachegrind.out.***
前端開發(fā)中的性能那點事(二)巧用curl 并發(fā)減少后端訪問時間
前言:
在我們平時的程序中難免出現(xiàn)同時訪問幾個接口的情況,平時我們用curl進行訪問的時候,一般都是單個、順序訪問,假如有3個接口,每個接口耗時500毫秒那么我們?nèi)齻接口就要花費1500毫秒了,這個問題太頭疼了嚴(yán)重影響了頁面訪問速度,有沒有可能并發(fā)訪問來提高速度呢?今天就簡單的說一下,利用curl并發(fā)來提高頁面訪問速度,
希望大家多指導(dǎo)。
1、老的curl訪問方式以及耗時統(tǒng)計
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php
function curl_fetch($url, $timeout=3){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
$errno = curl_errno($ch);
if ($errno>0) {
$data = false;
}
curl_close($ch);
return $data;
}
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$url_arr=array(
"taobao"=>"http://www.taobao.com",
"sohu"=>"http://www.sohu.com",
"sina"=>"http://www.sina.com.cn",
);
$time_start = microtime_float();
$data=array();
foreach ($url_arr as $key=>$val)
{
$data[$key]=curl_fetch($val);
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "耗時:{$time}";
?>
|
耗時:0.614秒
2、curl并發(fā)訪問方式以及耗時統(tǒng)計
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<?php
function curl_multi_fetch($urlarr=array()){
$result=$res=$ch=array();
$nch = 0;
$mh = curl_multi_init();
foreach ($urlarr as $nk => $url) {
$timeout=2;
$ch[$nch] = curl_init();
curl_setopt_array($ch[$nch], array(
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => $timeout,
));
curl_multi_add_handle($mh, $ch[$nch]);
++$nch;
}
/* wait for performing request */
do {
$mrc = curl_multi_exec($mh, $running);
} while (CURLM_CALL_MULTI_PERFORM == $mrc);
while ($running && $mrc == CURLM_OK) {
// wait for network
if (curl_multi_select($mh, 0.5) > -1) {
// pull in new data;
do {
$mrc = curl_multi_exec($mh, $running);
} while (CURLM_CALL_MULTI_PERFORM == $mrc);
}
}
if ($mrc != CURLM_OK) {
error_log("CURL Data Error");
}
/* get data */
$nch = 0;
foreach ($urlarr as $moudle=>$node) {
if (($err = curl_error($ch[$nch])) == '') {
$res[$nch]=curl_multi_getcontent($ch[$nch]);
$result[$moudle]=$res[$nch];
}
else
{
error_log("curl error");
}
curl_multi_remove_handle($mh,$ch[$nch]);
curl_close($ch[$nch]);
++$nch;
}
curl_multi_close($mh);
return $result;
}
$url_arr=array(
"taobao"=>"http://www.taobao.com",
"sohu"=>"http://www.sohu.com",
"sina"=>"http://www.sina.com.cn",
);
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$data=curl_multi_fetch($url_arr);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "耗時:{$time}";
?>
|
耗時:0.316秒
帥氣吧整個頁面訪問后端接口的時間節(jié)省了一半
3、curl相關(guān)參數(shù)
來自:http://cn2.php.net/manual/en/ref.curl.php
curl_close — Close a cURL session
curl_copy_handle — Copy a cURL handle along with all of its preferences
curl_errno — Return the last error number
curl_error — Return a string containing the last error for the current session
curl_exec — Perform a cURL session
curl_getinfo — Get information regarding a specific transfer
curl_init — Initialize a cURL session
curl_multi_add_handle — Add a normal cURL handle to a cURL multi handle
curl_multi_close — Close a set of cURL handles
curl_multi_exec — Run the sub-connections of the current cURL handle
curl_multi_getcontent — Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read — Get information about the current transfers
curl_multi_init — Returns a new cURL multi handle
curl_multi_remove_handle — Remove a multi handle from a set of cURL handles
curl_multi_select — Wait for activity on any curl_multi connection
curl_setopt_array — Set multiple options for a cURL transfer
curl_setopt — Set an option for a cURL transfer
curl_version — Gets cURL version information
前端開發(fā)中的性能那點事(三)php的opcode緩存
前言:由php的運行機制決定,其實php在運行階段我們也是可以進行緩存的從而提高程序運行效率,這就是我們常說的opcode緩存。
1、簡述php的運行機制
(因為本文是寫opcode緩存的所以這里只是簡要概述,后邊會專門寫一篇揭秘php運行機制的。)
a).php文件通過瀏覽器過來
b)請求交給SAPI,隨后SAPI層將控制權(quán)轉(zhuǎn)給PHP
c)zend_language_scanner對代碼進行掃描,對php代碼進行詞法分析轉(zhuǎn)換成一系列的tokens array
d)zend_language_parser將c步驟產(chǎn)生的一系列tokens處理掉空格等無用的代碼以后轉(zhuǎn)換成一系列表達式
e)經(jīng)過compiler階段生成opcode返回zend_op_array指針
f)zend_vm_execute根據(jù)傳入的zend_op_array指針,執(zhí)行opcode并將結(jié)果返回輸出
2、opcode簡介
Opcode是operation code(操作碼)的簡稱,其實就是第一小節(jié)c)、d)、e)步驟產(chǎn)生的一種中間碼,
opcode是一個四元組,(opcode, op1, op2, result),它們分別代表操作碼,第一操作數(shù),第二操作數(shù),結(jié)果。
如:
1
2
3
|
<?php
echo "taobao search blog";
?>
|
對應(yīng)的tokens
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
Array
(
[0] => Array
(
[0] => 367
[1] => <?php
[2] => 1
)
[1] => Array
(
[0] => 316
[1] => echo
[2] => 1
)
[2] => Array
(
[0] => 370
[1] =>
[2] => 1
)
[3] => Array
(
[0] => 315
[1] => "taobao search blog"
[2] => 1
)
[4] => ;
[5] => Array
(
[0] => 370
[1] =>
[2] => 1
)
[6] => Array
(
[0] => 369
[1] => ?>
[2] => 1
)
)
|
對應(yīng)的opcode就是
1
2
3
4
5
|
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > ECHO 'taobao+search+blog'
4 1 > RETURN 1
2* > ZEND_HANDLE_EXCEPTION
|
3、使用apc對opcode緩存
a)假設(shè)php路徑為/home/ad/php
對opcode進行緩存的軟件很多(apc、eAcclerator、Xcache、Zend Platform),這里主要介紹apc
APC提供兩種緩存功能,即緩存Opcode(目標(biāo)文件),我們稱之為apc_compiler_cache。同時它還提供一些接口用于PHP開發(fā)人員將用戶數(shù)據(jù)駐留在內(nèi)存中,我們稱之為apc_user_cache。我們這里主要討論apc_compiler_cache的配置。
下載地址:http://pecl.php.net/package/APC
最新版本為APC-3.1.6.tgz
1
2
3
4
5
6
7
|
wget http://pecl.php.net/get/APC-3.1.6.tgz
tar -zxvf APC-3.1.6.tgz
cd APC-3.1.6
/home/ad/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-php-config=/home/ad/php/bin/php-config
make
make install
|
編輯php.ini
添加apc的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[apc]
extension=apc.so
apc.enabled=1
apc.shm_segments = 1
apc.shm_size = 128
apc.ttl = 0
apc.user_ttl = 7200
apc.num_files_hint = 1000
apc.write_lock=1
apc.stat = 0
apc.max_file_size=1M
apc.filters = a.php,b.php
apc.cache_by_default=1
|
重新apache就ok啦
4、常用參數(shù)的解析
apc.enabled 開啟apc 設(shè)置為0關(guān)閉,1為開啟
apc.shm_segments 共享內(nèi)存塊數(shù)
apc.shm_size 共享內(nèi)存大小,但是是M
那么顯然共享內(nèi)存的總數(shù)就是apc.shm_segments*apc.shm_size
apc.num_files_hint 允許多少個opcode被緩存
apc.stat 為1的時候會自動檢查opcode對應(yīng)的php文件是否有更新,有更新的話會自動更新。設(shè)置為0的話就不會去檢查了這樣會提高apc的效率,但是要使php的修改生效的話就必須重啟apache了,或者使用函數(shù)apc_cache_clear()來清空緩存
apc.ttl opcode緩存的過期時間,設(shè)置為0表示不過期,如果不為0會檢查兩次請求之間的時間,如果時間大于設(shè)置值那么會更新opcode緩存
apc.write_lock 表示多個進程同時更新一份opcode緩存的時候那么只讓最先的一個生效,可以有效避免寫沖突
apc.max_file_size 超過設(shè)置值大小的文件不被緩存
apc.filters 需要特例的文件,多個文件用逗號(,)相隔
apc.filters 與 apc.cache_by_default結(jié)合使用,
當(dāng)apc.cache_by_default為1時apc.filters文件不被緩存,當(dāng)apc.cache_by_default為0時僅apc.filters文件被緩存
【PHP前端開發(fā)中的性能】相關(guān)文章:
PHP開發(fā)中關(guān)于文件操作的疑難問答07-22
php中file-get-contents與curl性能比較分析12-11
PHP程序性能優(yōu)化的方法12-01
php開發(fā)工具排行10-15
PHP開發(fā)CS結(jié)構(gòu)的技巧11-09
PHP開發(fā)中注意的事03-19