導(dǎo)論
PHP本身來(lái)說(shuō)是非常快的,但是當(dāng)你發(fā)起遠(yuǎn)程連接、加載文件等操作時(shí)也會(huì)遇到瓶頸。幸運(yùn)的是,有各種各樣的工具可以用來(lái)加速你應(yīng)用程序某些耗時(shí)的部分,或者說(shuō)減少某些耗時(shí)任務(wù)所需要運(yùn)行的次數(shù)。
Opcode緩存
當(dāng)一個(gè)PHP文件被解釋執(zhí)行的時(shí)候,首先是被編譯成名為opcodes的中間代碼,然后才被底層的虛擬機(jī)執(zhí)行。如果PHP文件沒(méi)有被修改過(guò),opcode始終是一樣的。這就意味著編譯步驟白白浪費(fèi)了CPU的資源。
此時(shí)opcode緩存就派上用場(chǎng)了。通過(guò)將opcode緩存在內(nèi)存中,它能防止冗余的編譯步驟,并且在下次調(diào)用執(zhí)行時(shí)得到重用。設(shè)置opcode緩存只需要幾分鐘的時(shí)間,你的應(yīng)用程序便會(huì)因此大大加速,實(shí)在沒(méi)有理由不用它。
PHP 5.5中自帶opcode緩存工具,叫做Zend OPcache,默認(rèn)一般是開(kāi)啟的,請(qǐng)?jiān)趐hpinfo()輸出中檢查opcache enable關(guān)鍵詞是否出現(xiàn)來(lái)確認(rèn)是否開(kāi)啟。早期的版本也能通過(guò)PECL擴(kuò)展來(lái)安裝。
對(duì)象緩存
有時(shí)緩存代碼中的單個(gè)對(duì)象會(huì)很有用,比如有些需要很大開(kāi)銷獲取的數(shù)據(jù)或者一些結(jié)果集不怎么變化的數(shù)據(jù)庫(kù)查詢。你可以使用一些緩存軟件將這些數(shù)據(jù)存放在內(nèi)存中以便下次高速獲取。如果你獲得數(shù)據(jù)后把他們存起來(lái),下次請(qǐng)求直接從緩存里面獲取數(shù)據(jù),在減少數(shù)據(jù)庫(kù)負(fù)載的同時(shí)能極大提高性能。
許多流行的字節(jié)碼緩存方案也能緩存定制化的數(shù)據(jù),所以更有理由好好使用它們了。APCu、XCache以及WinCache都提供了API,以便你將數(shù)據(jù)緩存在內(nèi)存中。
最常用的內(nèi)存對(duì)象緩存系統(tǒng)是APCu和Memcached。APCu對(duì)于對(duì)象緩存來(lái)說(shuō)是個(gè)很好的選擇,它提供了簡(jiǎn)單的API,讓你能將數(shù)據(jù)緩存到內(nèi)存,并且容易設(shè)置和使用。APCu的局限性表現(xiàn)在它依賴于所在的服務(wù)器。另一方面,Memcached以獨(dú)立的服務(wù)的形式安裝,可以通過(guò)網(wǎng)絡(luò)交互,這意味著你能將數(shù)據(jù)集中存在一個(gè)高速存取的地方,而且許多不同的系統(tǒng)能從中獲取數(shù)據(jù)。
值得注意的是當(dāng)你以CGI(FastCGI)的形式使用PHP時(shí),每個(gè)進(jìn)程將會(huì)有各自的緩存,比如說(shuō),APCu緩存數(shù)據(jù)無(wú)法在多個(gè)工作進(jìn)程中共享。在這種情況下,你可能得考慮Memcached了,由于它獨(dú)立于PHP進(jìn)程。
通常APCu在存取速度上比Memcached更快,但是Memcached在擴(kuò)展上更有優(yōu)勢(shì)。如果你不希望應(yīng)用程序涉及多個(gè)服務(wù)器,或者不需要Memcached提供的其他特性,那么APCu可能是最好的選擇。
注意在PHP 5.5之前,APC同時(shí)提供了對(duì)象緩存與字節(jié)碼緩存。APCu是為了將APC的對(duì)象緩存移植到PHP 5.5+的一個(gè)項(xiàng)目,因?yàn)楝F(xiàn)在PHP有了內(nèi)建的字節(jié)碼緩存方案(OPcache)。