PHP 應用程式的效能最佳化

來源:互聯網
上載者:User

簡介:這是PHP 應用程式的效能最佳化的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=324418' scrolling='no'>

作者:劉彥青編譯

使用PHP編程的最大好處是學習這種程式設計語言非常容易以及其豐富的庫。即使對需要使用的函數不是十分瞭解,我們也能夠猜測出如何完成一個特定的任務。

儘管PHP非常簡單易學,但我們仍然需要花費一點時間來學習PHP的一些編程技巧,尤其是與效能和記憶體佔用相關的技巧。在PHP中,有許多小技巧能夠使我們減少記憶體的佔用,並提高應用程式的效能。在本篇文章中,我們將對PHP應用程式的分析、如何改變指令碼代碼以及比較最佳化前後的各種參數值進行簡要的介紹。

通過在程式中設定計時的程式,並反覆執行這些代碼,我們可以獲得有關程式執行速度的一組資料,這些資料可以可以用來發現程式中的瓶頸,以及如何進行最佳化,提高應用程式的效能。

也許讀者曾經聽說過PEAR庫吧。我們將使用PEAR庫建立在分析時需要使用的例子,這也是對現有的代碼進行分析的最簡單的方法,它使我們無需使用商用產品就能對代碼進行分析。

我們要使用的庫的名字是PEAR::Benchmark,它對於對代碼進行分析和效能測試非常有用。這個庫提供一個名字為Benchmark_Timer()的類,能夠記錄一個函數調用和下一個函數調用之間的時間。在對代碼的效能進行測試時,我們可以得到一個詳細的指令碼執行結果,它非常簡單,如下所示:

include_once("Benchmark/Timer.php");
$bench = new Benchmark_Timer;

$bench->start();
$bench->setMarker('Start of the script');

// 現在處於睡眠狀態幾分鐘
sleep(5);

$bench->stop();

// 從計時器中獲得分析資訊
print_r($bench->getProfiling());
?>

上面代碼執行後的輸出如下所示:

Array
(
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => -
[total] => 0
)

[1] => Array
(
[name] => Start of the script
[time] => 1013214253.05761100
[diff] => 9.8943710327148E-05
[total] => 9.8943710327148E-05
)

[2] => Array
(
[name] => Stop
[time] => 1013214258.04920700
[diff] => 4.9915959835052
[total] => 4.9916949272156
)

)

上面的數字似乎是一組雜亂無章的數字,但如果程式的規模更大,這些數字就十分地有用了。

也許廣大讀者也能猜測到,數組的第一個表目是實際調用Benchmark_Timer()類的方法,例如

$bench->start()、$bench->setMarker()和$bench->stop(),與這些表目有關的數字是相當簡單的,現在我們來仔細地研究這些數字:

[0] => Array

(

[name] => Start

[time] => 1013214253.05751200

[diff] => -

[total] => 0

)

time表目指的是何時對Benchmark_Timer()的start()方法調用的UNIX的timestamp,diff表目表示這次調用和上次調用之間的時間間隔,由於這裡沒有上一次,因此顯示出了一個破折號,total表目指的是自測試開始到這一特定的調用之前代碼啟動並執行總的時間。下面我們來看看下一個數組的輸出:

[1] => Array

(

[name] => Start of the script

[time] => 1013214253.05761100

[diff] => 9.8943710327148E-05

[total] => 9.8943710327148E-05

)

從上面的數字我們可以看出,在調用$bench->start()之後,程式運行了9.8943710327148E-05秒(也就是

0.0000989秒)後開始調用$bench->setMarker(....)。

一次真實的效能測試經曆

儘管上面的例子不錯,但在對於決定如何最佳化你的站台碼設計方面,它真的不能算是一個好例子。下面我將用我自己作為網站技術人員的一段親身經曆來說明如何解決效能方面存在的問題。

我並不大理解網站使用的代碼,因為它是根據特殊的需求,曆經多年開發而成的━━其中的一個模組包括網站轉碼,另一個模組記錄網站的使用方式,其他的模組也各有各的作用。我和網站的主要開發人員都意識到網站的代碼需要最佳化,但又不清楚問題出在哪兒。

為了儘快地完成任務,我開始研究網站的主要指令碼代碼,並在全部指令碼代碼以及其包含檔案中添加了一些

$bench->setMarker()命令,然後分析$bench->getProfiling()的輸出,並對得到的結果大吃一驚,原來問題出在一個與獲得特定語言名字(例如en代表english)的轉碼的函數調用中,該函數在每個頁面上都會被使用數百次。每次調用該函數時,指令碼代碼都會對一個MySQL資料庫進行查詢,從一個資料庫表中獲得真正的語言名字。

於是我們這一類的資訊建立了一個緩衝系統。經過短短2天時間的工作,我們使系統的效能得到了很大的提高,第一周內頁面的瀏覽量也因此而增加了40%。當然了,這隻是一個有關分析代碼能夠提高互連網應用或互連網網站效能的例子。

效能測試函數調用

在分析一個指令碼或網頁(以及其包含檔案)時,儘管Benchmark_Timer()特別有用,但它並不科學,因為要獲得分析的資料我們必須多次載入指令碼,而且它也不是針對某個類或函數調用的。

PEAR::Benchmark庫中的另一個被稱作Benchmark_Iterator的類能夠很好地解決這一個問題,它能夠針對特定的函數或類的方法,顯示其分析資訊。它的用途是能夠能夠從測試中獲得一致的結果,因為我們知道,如果運行一段指令碼一次,其已耗用時間為10秒,並不意味著它每次的已耗用時間總是10秒。

In any case, let's see some examples:

// 串連資料庫的代碼
include_once("DB.php");
$dsn = array(
'phptype' => 'mysql',
'hostspec' => 'localhost',
'database' => 'database_name',
'username' => 'user_name',
'password' => 'password'
);
$dbh = DB::connect($dsn);

function getCreatedDate($id)
{
global $dbh;

>$stmt = "SELECT created_date FROM users WHERE id=$id";
// 在這裡使用PEAR::DB
$created_date = $dbh->getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else {
return $created_date;
}
}

include_once 'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate;

// 運行getDate函數10次
$bench->run(10, 'getCreatedDate', 1);

// 列印分析資訊
print_r($bench->get());
?>

運行上面的代碼能夠產生與下面相似的結果:

Array
(
[1] => 0.055413007736206
[2] => 0.0012860298156738
[3] => 0.0010279417037964
[4] => 0.00093603134155273
[5] => 0.00094103813171387
[6] => 0.00092899799346924
[7] => 0.0010659694671631
[8] => 0.00096404552459717
[9] => 0.0010690689086914
[10] => 0.00093603134155273
[mean] => 0.0064568161964417
[iterations] => 10
)

上面的這些數字很好理解,mean條目表示getCreatedDate()函數10次啟動並執行平均時間。在進行實際測試時,應該至少運行1000次,但這個例子得出的結果已經足夠說明問題了。

結束語

希望廣大讀者能夠通過本篇文章掌握如何迅速地對PHP代碼進行分析的基本方法。在這裡我還還要提醒廣大讀者的是,對代碼進行分析不是一件簡單的事兒,因為我們必須掌握大量的有關該種語言的特性。在代碼中添加計時用的代碼有助於找出運行速度緩慢的函數,利用多次重複的方法使我們能夠發現對代碼進行正確最佳化的方法。

本文轉載:賽迪網

“PHP 應用程式的效能最佳化”的更多相關文章 》

愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具

http://biancheng.dnbcw.info/php/324418.html pageNo:14

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.