快取
PHP 本身非常快速,但是在遇到諸如遠端連線,載入檔案時會有瓶頸。好佳在,有很多工具可以加速這些部分的處理,或是減少進行這些耗時任務的次數。
Bytecode 快取
當 PHP 檔案被執行時,會先被編碼成 bytecode ,(也被稱為 opcode ),然後才會執行這些 bytecode。如果 PHP 檔案沒有被修改,編成的 bytecode 也不會改變。這意味這編碼這一步驟是浪費 CPU 資源的。
這就是 Bytecode 快取的用途。它會將編好 bytecode 存在記憶體,並且在往後的呼叫中重複使用,以防止多餘的編譯。 設定 bytecode 快取僅需要花上幾分鐘,然後應用程式的執行速度就能得到飛快的提升。實在沒有理由不使用它。
在 PHP 5.5 之後,內建有 bytecode 快取, OPcache ,更早的版本也可以使用。
其他流行的 bytecodes 快取:
- APC (PHP 5.4 and earlier)
- XCache
- Zend Optimizer+ (part of Zend Server package)
- WinCache (extension for MS Windows Server)
物件快取
快取程式碼裡面的物件常常是很有助益的,像是取得時很耗資源的資料,或是資料庫裡不太會變動的資料。你可以使用物件快取系統來保存這些資料以供日後快速取用。如果你在取出這些資料後可以儲存它們,那麼在往後的請求裡就可以直接使用這些資料,從而獲得效能的提升並減少資料庫的負擔。
有很多流行的 bytecode 快取同時也可以讓你儲存自定義資料,所以這或許是一個更好的理由去使用他們。 PCu , XCache , 和 WinCache 都有 APIs 可以將資料從 PHP 程式碼存到記憶體。
最常用的記憶體資料快取系統是 APCu 和 memcached 。 APCu 是儲存資料很好的選擇之一,他有很簡單的 API 讓你把資料加到記憶體快取,並且非常容易設定和使用。但是 APCu 的一個限制是只能用在其安裝的伺服器上。 另一方面, Memcached 可以作為獨立的服務,可以從網路存取,意味著你可以將資料可以存在 hyper-fast 資料儲存中心以及很多不同可以取得資料的系統。
注意如果在伺服器跑的是 PHP (Fast-)CGI ,每個 PHP 行程會有自己的快取,也就是說, APCu 的資料不會在工作行程( worker processes )間共用,因為它不會綁定到 PHP 的行程。
在單一網路環境內, APCu 的存取速度通常會表現的比 memcached 好,但是 memcached 可以很快速的進行擴展。如果你不打算用多伺服器架設你的應用程式,或是不需要 memcached 特有的功能, APCu 或許是快取資料的最好選擇。
APCu 的使用範例:
<?php
// 卻認是否有稱作 'expensive_data' 的資料存在快取裡
$data = apc_fetch('expensive_data');
if ($data === false) {
// 如果資料沒有被快取,把耗費昂貴成本取得的資料存起來供往後使用
apc_add('expensive_data', $data = get_expensive_data());
}
print_r($data);
注意在 PHP 5.5 之前, APC 同時提供了資料快取和 bytecode 快取。 APCu 是用在 PHP 5.5+ 資料快取的 APC 分支,因為 PHP 已經有內建的bytecode 快取了。
更多流行的資料快取系統: