近年來(lái),隨著web應(yīng)用程序越來(lái)越復(fù)雜,對(duì)于php響應(yīng)速度的要求也越來(lái)越高,因此優(yōu)化運(yùn)行在php上的應(yīng)用程序已經(jīng)成為許多web開(kāi)發(fā)人員追求的最終目標(biāo)。本文主要分享php優(yōu)化的相關(guān)經(jīng)驗(yàn),幫助開(kāi)發(fā)人員優(yōu)化運(yùn)行在php上的應(yīng)用程序,提高程序的響應(yīng)速度。
1.緩存機(jī)制
緩存是提高php應(yīng)用程序性能的一個(gè)基本手段。針對(duì)頻繁查詢(xún)、讀取、計(jì)算的應(yīng)用程序?qū)ο?,通過(guò)緩存可以將其數(shù)據(jù)記錄在內(nèi)存中,提高讀取性能,減輕服務(wù)器的負(fù)擔(dān),顯著提高程序的響應(yīng)速度。思想上,緩存機(jī)制就類(lèi)似于圖書(shū)館,讀者查閱一本新書(shū)需要付費(fèi),而對(duì)于已經(jīng)處于圖書(shū)館閱覽室內(nèi)的“流暢”,則可以隨意閱讀,用此類(lèi)比,很容易理解緩存機(jī)制的精髓所在。
以下代碼是以memcached緩存為例,用于在程序中實(shí)現(xiàn)緩存機(jī)制:
在這個(gè)例子中,我們僅當(dāng)緩存中不存在“user_cache”時(shí),再?gòu)臄?shù)據(jù)庫(kù)中讀取數(shù)據(jù)。如果緩存中已存在“user_cache”的數(shù)據(jù),則直接從內(nèi)存中讀取,避免了頻繁連接數(shù)據(jù)庫(kù)的開(kāi)銷(xiāo),從而提高了程序的響應(yīng)速度。
2.避免使用eval()函數(shù)
eval()函數(shù)是php中的一個(gè)強(qiáng)大的函數(shù),它可以執(zhí)行字符串中的php代碼。但是,由于安全問(wèn)題,eval()函數(shù)在實(shí)際應(yīng)用中被嚴(yán)格禁止使用。那么,如何避免使用eval()函數(shù)而不影響代碼的運(yùn)作呢?下面的代碼給出了一種替代eval()函數(shù)的方式:
在這個(gè)例子中,我們使用create_function()函數(shù)將一個(gè)字符串映射成一個(gè)可執(zhí)行的函數(shù),并在執(zhí)行該函數(shù)之前檢查該函數(shù)是否已經(jīng)存在,從而實(shí)現(xiàn)了eval()函數(shù)的替代。
3.使用更快的函數(shù)
在php中,有一些函數(shù)比其它函數(shù)更快,例如:一些簡(jiǎn)單的函數(shù)可能比復(fù)雜函數(shù)更快,又例如array_key_exists()函數(shù)比in_array()更快。因此,盡可能避免使用復(fù)雜的函數(shù),并使用更快的函數(shù)是提高php應(yīng)用程序性能的一個(gè)重要方面。
以下代碼展示了使用array_key_exists()函數(shù)替代isset()函數(shù)的方式:
4.使用更快的循環(huán)方式
在php中,有多種循環(huán)方式,如for、foreach和while等。針對(duì)不同的數(shù)據(jù)量和數(shù)據(jù)類(lèi)型,選擇不同的循環(huán)方式是提高php應(yīng)用程序性能的一個(gè)重要方面。
以下代碼展示了遍歷多維數(shù)組的兩種不同方式:
在這個(gè)例子中,方式二使用for循環(huán)的方式要比方式一的foreach循環(huán)性能更好。
5.使用OPcache
OPcache是php5.5以后的內(nèi)置擴(kuò)展,可以顯著提高php應(yīng)用程序性能。OPcache將預(yù)編譯的php腳本存儲(chǔ)在內(nèi)存中并緩存,避免了頻繁的文件讀取和編譯的開(kāi)銷(xiāo),從而顯著提高了程序的響應(yīng)速度。以下是啟動(dòng)OPcache的方式:
通過(guò)上述方法,可以有效優(yōu)化php應(yīng)用程序的運(yùn)行效率,提高程序的響應(yīng)速度。也讓我們堅(jiān)信,對(duì)于一個(gè)好的web開(kāi)發(fā)人員而言,優(yōu)化性能和提高代碼質(zhì)量成為人才的必備技能之一。
1.緩存機(jī)制
緩存是提高php應(yīng)用程序性能的一個(gè)基本手段。針對(duì)頻繁查詢(xún)、讀取、計(jì)算的應(yīng)用程序?qū)ο?,通過(guò)緩存可以將其數(shù)據(jù)記錄在內(nèi)存中,提高讀取性能,減輕服務(wù)器的負(fù)擔(dān),顯著提高程序的響應(yīng)速度。思想上,緩存機(jī)制就類(lèi)似于圖書(shū)館,讀者查閱一本新書(shū)需要付費(fèi),而對(duì)于已經(jīng)處于圖書(shū)館閱覽室內(nèi)的“流暢”,則可以隨意閱讀,用此類(lèi)比,很容易理解緩存機(jī)制的精髓所在。
以下代碼是以memcached緩存為例,用于在程序中實(shí)現(xiàn)緩存機(jī)制:
$mc=new Memcached();
$mc->addServer("localhost", 11211);
$key="user_cache";
$user=$mc->get($key);
if(!$user){
$user=DB::select("select * fromuser
whereuid
=1"); $mc->set($key, $user, 3600); } return $user;
在這個(gè)例子中,我們僅當(dāng)緩存中不存在“user_cache”時(shí),再?gòu)臄?shù)據(jù)庫(kù)中讀取數(shù)據(jù)。如果緩存中已存在“user_cache”的數(shù)據(jù),則直接從內(nèi)存中讀取,避免了頻繁連接數(shù)據(jù)庫(kù)的開(kāi)銷(xiāo),從而提高了程序的響應(yīng)速度。
2.避免使用eval()函數(shù)
eval()函數(shù)是php中的一個(gè)強(qiáng)大的函數(shù),它可以執(zhí)行字符串中的php代碼。但是,由于安全問(wèn)題,eval()函數(shù)在實(shí)際應(yīng)用中被嚴(yán)格禁止使用。那么,如何避免使用eval()函數(shù)而不影響代碼的運(yùn)作呢?下面的代碼給出了一種替代eval()函數(shù)的方式:
$source_code = 'return '.$code.';'; $result = false; try{ $result = create_function($args, $source_code); }catch(Exception $e){ echo 'create_function error:'.$e->getMessage().'<br>'; } if (!$result){ $result = eval($source_code); } return $result;
在這個(gè)例子中,我們使用create_function()函數(shù)將一個(gè)字符串映射成一個(gè)可執(zhí)行的函數(shù),并在執(zhí)行該函數(shù)之前檢查該函數(shù)是否已經(jīng)存在,從而實(shí)現(xiàn)了eval()函數(shù)的替代。
3.使用更快的函數(shù)
在php中,有一些函數(shù)比其它函數(shù)更快,例如:一些簡(jiǎn)單的函數(shù)可能比復(fù)雜函數(shù)更快,又例如array_key_exists()函數(shù)比in_array()更快。因此,盡可能避免使用復(fù)雜的函數(shù),并使用更快的函數(shù)是提高php應(yīng)用程序性能的一個(gè)重要方面。
以下代碼展示了使用array_key_exists()函數(shù)替代isset()函數(shù)的方式:
if (array_key_exists('key', $array)) { echo 'ok'; } else { echo 'no'; }
4.使用更快的循環(huán)方式
在php中,有多種循環(huán)方式,如for、foreach和while等。針對(duì)不同的數(shù)據(jù)量和數(shù)據(jù)類(lèi)型,選擇不同的循環(huán)方式是提高php應(yīng)用程序性能的一個(gè)重要方面。
以下代碼展示了遍歷多維數(shù)組的兩種不同方式:
$menus = [ [0 => "abc", 1 => "123"], [0 => "def", 1 => "456"] ]; //方式一:foreach foreach ($menus as $row) { foreach ($row as $cell) { echo $cell; } } //方式二:for $count = count($menus); for($i = 0; $i < $count; $i++) { echo $menus[$i][0]; echo $menus[$i][1]; }
在這個(gè)例子中,方式二使用for循環(huán)的方式要比方式一的foreach循環(huán)性能更好。
5.使用OPcache
OPcache是php5.5以后的內(nèi)置擴(kuò)展,可以顯著提高php應(yīng)用程序性能。OPcache將預(yù)編譯的php腳本存儲(chǔ)在內(nèi)存中并緩存,避免了頻繁的文件讀取和編譯的開(kāi)銷(xiāo),從而顯著提高了程序的響應(yīng)速度。以下是啟動(dòng)OPcache的方式:
opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60
通過(guò)上述方法,可以有效優(yōu)化php應(yīng)用程序的運(yùn)行效率,提高程序的響應(yīng)速度。也讓我們堅(jiān)信,對(duì)于一個(gè)好的web開(kāi)發(fā)人員而言,優(yōu)化性能和提高代碼質(zhì)量成為人才的必備技能之一。