鍍金池/ 教程/ PHP/ 緩存
依賴管理
安全
測試
使用模板
開發(fā)實踐
入門指南
服務(wù)器與部署
社區(qū)
語言亮點
錯誤與異常
虛擬化技術(shù)
資源
文檔撰寫
數(shù)據(jù)庫
依賴注入
緩存
代碼風(fēng)格指南

緩存

PHP 本身來說是非??斓?,但是但你當(dāng)發(fā)起遠(yuǎn)程連接、加載文件等操作時也會遇到瓶頸。 幸運(yùn)的是,有各種各樣的工具可以用來加速你應(yīng)用程序某些耗時的部分,或者說減少某些耗時任務(wù)所需要運(yùn)行的次數(shù)。

Opcode 緩存

當(dāng)一個 PHP 文件被解釋執(zhí)行的時候,首先是被編譯成名為 opcode 的中間代碼,然后才被底層的虛擬機(jī)執(zhí)行。 如果PHP文件沒有被修改過,opcode 始終是一樣的。這就意味著編譯步驟白白浪費(fèi)了 CPU 的資源。

此時 opcode 緩存就派上用場了。通過將 opcode 緩存在內(nèi)存中,它能防止冗余的編譯步驟,并且在下次調(diào)用執(zhí)行時得到重用。設(shè)置 opcode 緩存只需要幾分鐘的時間,你的應(yīng)用程序便會因此大大加速,實在沒有理由不用它。

PHP 5.5 中自帶了 opcode 緩存工具,叫做OPcache,早期的版本也能通過一定的配置使用它。 更多關(guān)于 opcode 緩存的資料:

對象緩存

有時緩存代碼中的單個對象會很有用,比如有些需要很大開銷獲取的數(shù)據(jù)或者一些結(jié)果集不怎么變化的數(shù)據(jù)庫查詢。你可以使用一些緩存軟件將這些數(shù)據(jù)存放在內(nèi)存中以便下次高速獲取。如果你獲得數(shù)據(jù)后把他們存起來,下次請求直接從緩存里面獲取數(shù)據(jù),在減少數(shù)據(jù)庫負(fù)載的同時能極大提高性能。

許多流行的字節(jié)碼緩存方案也能緩存定制化的數(shù)據(jù),所以更有理由好好使用它們了。APCu、XCache 以及 WinCache 都提供了 API,以便你將數(shù)據(jù)緩存到內(nèi)存中

最常用的內(nèi)存對象緩存系統(tǒng)是 APCu 和 Memcached 。APCu 對于對象緩存來說是個很好的選擇,它提供了簡單的 API 讓你能將數(shù)據(jù)緩存到內(nèi)存,并且很容易設(shè)置和使用。APCu 的局限性表現(xiàn)在它依賴于所在的服務(wù)器。另一方面,Memcached 以獨立的服務(wù)的形式安裝,可以通過網(wǎng)絡(luò)交互,這意味著你能將數(shù)據(jù)集中存在一個高速存取的地方,而且許多不同的系統(tǒng)能從中獲取數(shù)據(jù)。

值得注意的是當(dāng)你以 CGI(FastCGI) 的形式使用 PHP 時,每個進(jìn)程將會有各自的緩存,比如說,APCu 緩存數(shù)據(jù)無法在多個工作進(jìn)程中共享。在這種情況下,你可能得考慮 Memcached 了,由于它獨立于 PHP 進(jìn)程。

通常 APCu 在存取速度上比 Memcached 更快,但是 Memcached 在擴(kuò)展上更有優(yōu)勢。如果你不希望應(yīng)用程序涉及多個服務(wù)器,或者不需要 Memcached 提供的其他特性,那么 APCu 可能是最好的選擇。

使用 APCu 的例子:

{% highlight php %}
<?php
// check if there is data saved as 'expensive_data' in cache
$data = apc_fetch('expensive_data');
if ($data === false) {
    // data is not in cache; save result of expensive call for later use
    apc_add('expensive_data', $data = get_expensive_data());
}
print_r($data);
{% endhighlight %}

注意在 PHP 5.5 之前,APC 同時提供了對象緩存與字節(jié)碼緩存。APCu 是為了將 APC 的對象緩存移植到 PHP 5.5+ 的一個項目,因為現(xiàn)在 PHP 有了內(nèi)建的字節(jié)碼緩存方案 (OPcache)。

更多關(guān)于緩存系統(tǒng)的項目:

上一篇:資源