Optimizer+ 是 Zend 開發的閉源但可以免費使用的 PHP 最佳化加速組件,是第一個也是最快的 opcode 緩衝工具。現在,Zend 科技公司將 Optimizer+ 在 PHP License 下開源成為 Zend Opcache。
Zend OPcache 通過 opcode 緩衝和最佳化提供更快的 PHP 執行過程。它將先行編譯的指令檔儲存在共用記憶體中供以後使用,從而避免了從磁碟讀取代碼並進行編譯的時間消耗。同時,它還應用了一些代碼最佳化模式,使得代碼執行更快。
1. 什麼是 opcode 緩衝?
當解譯器完成對指令碼代碼的分析後,便將它們產生可以直接啟動並執行中間代碼,也稱為作業碼(Operate Code,opcode)。Opcode cache 的目地是避免重複編譯,減少 CPU 和記憶體開銷。如果動態內容的效能瓶頸不在於 CPU 和記憶體,而在於 I/O 操作,比如資料庫查詢帶來的磁碟 I/O 開銷,那麼 opcode cache 的效能提升是非常有限的。但是既然 opcode cache 能帶來 CPU 和記憶體開銷的降低,這總歸是好事 ?? 本著環保的態度,也應該盡量減少消耗不是? :D
現代作業碼緩衝器(Optimizer+,APC2.0+,其他)使用共用記憶體進行儲存,並且可以直接從中執行檔案,而不用在執行前“還原序列化”代碼。這將帶來顯著的效能加速,通常降低了整體伺服器的記憶體消耗,而且很少有缺點。
2. Optimizer+ 與 APC 的優缺點對比
Optimizer+ 於 2013年3月中旬改名為 Opcache。
根據 PHP wiki 上的討論,Zend Opcache 即將整合到 php 5.5 中。作為 APC 的競爭者,新生的 Zend Opcache 很有可能取代 APC 的位置,雖然 OptimizerPlus 沒有象 APC 那樣的 user cache 功能。
OPTIMIZER+ 相對 APC 的優點
效能。根據測試,Zend Optimizer+ 始終優於 APC。隨代碼差異,每秒鐘處理的請求數高 5~20%。Google doc 上記錄的測試結果中,WordPress 2.1.1(不知道為什麼不用個新版本的 WP 來測試),效能提高約 8%。理論上來說,對於 WP 3.5.1,效能應該也能得到大約 5~10% 的提升吧。對於運行 WordPress 的伺服器而言,使用 Optimizer+ 可以顯著降低 CPU 使用率和提高頁面載入速度(graphics here)。 支援新的 PHP 版本。Zend 和 PHP 社區都會協助 Optimizer+ 能夠支援最新版本的 PHP。 可靠性。Optimizer+ 擁有可選的損壞檢測能力,可以防止因資料損毀而導致的伺服器崩潰。 更好的相容性。PHP 社區打算讓 Optimizer+ 與社區支援的所有 PHP 版本相相容。
APC 相對 OPTIMIZER+ 的優勢
APC 有資料緩衝 API,而 Optimizer+ 沒有。 APC 能夠回收舊的無效的指令碼佔用的記憶體。APC 有記憶體管理器,可以將那些不再使用的指令碼關聯的記憶體進行回收。而 Optimizer+ 不同,它將這樣的記憶體標記為“髒的”,但並不會回收它們。一旦“髒的”記憶體佔用配置閾值的百分比達到一定值,Optimizer+ 就將自己重新啟動。這種行為在穩定性上既有優勢也有劣勢。
3. 使用 Zend Opcode
現在已經可以使用 Zend Opcache 替代 APC 作為 PHP 最佳化加速工具了。目前的 Zend Opcode 相容 PHP 5.2.*、5.3.*、5.4.* 和 PHP-5.5 開發版。不過,將來會取消對 PHP 5.2 的支援。
注意:Zend Opcache 與 eaccelerator 相衝突。要安裝 Zend Opcache,可能需要先卸載 eaccelerator ?? 如果你用了這個加速模組的話。
從源碼安裝並配置¶
Zend Opcache 的原始碼託管在 github 上,目前還是叫做 ZendOptimizerPlus。
安裝步驟詳見其 README 檔案。
注意:
最好在本地虛擬機器裡測試之後再部署到自己的伺服器上; 安裝前最好先刪除 eacceleratro、xcache 或 apc 等組件。
順便說一句,從源碼編譯安裝時需要用到 php-devel。README 中快速安裝一節的開頭就用到,
$PHP_DIR/bin/phpize
如果不清楚 phpize 的路徑,可以,
whereis phpize
README 檔案中也有相應的推薦最佳化設定。
從 EPEL 源安裝並配置
我不喜歡從源碼編譯安裝程式,一個是水平有限,一個就是怕麻煩。下面介紹從 EPEL 安裝源安裝 Zend Opcache,以 CentOS 上的操作為例,基於我的 VPS 的配置。
EPEL 社區已經提供了 Zend Opcache 的安裝包,可以直接 yum 安裝。當然,前提是已經配置使用了 EPEL 的安裝源。如果沒有,可以參考這裡。
提醒一下,REMI 安裝源上的 PHP 已經是 5.4 版本了。鑒於有人測試說 WordPress 在 PHP 5.4 上的效能要優於在 PHP 5.3 上的效能(10% faster and lower ram consuming),順便升級一下 PHP 也不是什麼壞事。
操作步驟:
配置使用 epel 安裝源。已有則跳過。 刪除 eaccelerator、xcache、apc:
yum remove php-eaccelerator php-xcache php-apcu
沒有使用則跳過。
對系統執行升級:
yum update
目的是根據 remi 安裝源的狀態升級當前的 php 等軟體到 remi 支援的最新版本。此時,可以看到系統有類似下面的輸出:
Updating : php-common-5.4.14-1.el6.remi.i686 1/26WARNING : These php-* RPM are not official Fedora / Red Hat build andoverrides the official ones. Don't file bugs on Fedora Project nor Red Hat.Use dedicated forums created as /etc/php.ini.rpmnew Updating : mysql-libs-5.5.31-1.el6.remi.i686 2/26WARNING : This MySQL RPM is not an official Fedora / Red Hat build and itoverrides the official one. Don't file bugs on Fedora Project nor Red Hat.Use dedicated forums
表示我們現在要從 Fedora / Red Hat 的版本遷移到 Remi 版本了,所以不要去 Fedora / Red Hat 尋求協助了。呵呵,貌似出問題都是在網上找,還真是很少到官方論壇裡提問。像我這樣的入門級使用者,也不會遇到那麼深度的問題。
安裝 Zend Opcache(pecl 版本):
yum install php-pecl-zendopcache
安裝時產生的 opcache 的設定檔位於預設的 /etc/php.d 目錄中:
opcache-default.blacklistopcache.ini
這個設定檔採用的基本就是 README 中的推薦設定,只有幾個地方需要修改。
vi /etc/php.d/opcache.ini
對照如下推薦配置修改並儲存即可(可參考完整的 Zend Opcache 配置資訊):
opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1opcache.enable_cli=1
不需要修改 php.ini 配置,重起 Apache 服務使之生效:
service httpd restart
查詢一下看看是否正確啟動了:
php -v
輸出結果類似於:
PHP 5.4.14 (cli) (built: Apr 11 2013 11:04:35)Copyright (c) 1997-2013 The PHP GroupZend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies with Zend OPcache v7.0.1, Copyright (c) 1999-2013, by Zend Technologies
4. 體會
PHP 上有不少 opcode cache 組件,如 APC、eAccelerator、XCache 等。(參見 Wikipedia 上的 PHP accelerators 列表。)看 PHP wiki 上的意思,這個新引入的 Zend Opcache 的效能應該是最好的。不管用哪個組件,總歸是用一個才好。
對於小型的伺服器,似乎這幾個組件的效能差異並不太明顯。我的想法是,既然用了,那就用個最好的吧。但是如果你正在使用別的 opcode cache,比如上面提到的這幾個中的一個,從效能提升上講,倒是沒必要立刻就換。
對這個站,首頁產生時間:僅使用 PHP 的時候,大約 0.9s;使用 eAccelerator 大約 0.63s;使用 Zend Opcache 後大約 0.55s。測試得非常簡陋,多開啟幾次看看 WP Super Cache 提供的頁面產生時間,估計一個平均數。
登入到系統裡看了看 Apache 進程的記憶體佔用。之前一個進程不多大一會兒就能佔用 40MB 以上的記憶體,現在基本上沒有高於 40MB 的了。只是不知道是 php 5.4 的功勞呢,還是 Zend Opcache 的功勞。
不知道您覺得這個 Zend Opcache 的效果如何?如果您有興趣,不妨留言寫下您的測試結果。©