使用 Zend Opcache 加速 PHP (2)

Optimizer+ 是 Zend 開發的閉源但能夠無償使用的 PHP 優化加速組件,是第一個也是最快的 opcode 緩存工具。如今,Zend 科技公司將 Optimizer+ 在 PHP License 下開源成爲 Zend Opcache。

Zend OPcache 經過 opcode 緩存和優化提供更快的 PHP 執行過程。它將預編譯的腳本文件存儲在共享內存中供之後使用,從而避免了從磁盤讀取代碼並進行編譯的時間消耗。同時,它還應用了一些代碼優化模式,使得代碼執行更快。 php

1. 什麼是 opcode 緩存?

當解釋器完成對腳本代碼的分析後,便將它們生成能夠直接運行的中間代碼,也稱爲操做碼(Operate Code,opcode)。Opcode cache 的目地是避免重複編譯,減小 CPU 和內存開銷。若是動態內容的性能瓶頸不在於 CPU 和內存,而在於 I/O 操做,好比數據庫查詢帶來的磁盤 I/O 開銷,那麼 opcode cache 的性能提高是很是有限的。可是既然 opcode cache 能帶來 CPU 和內存開銷的下降,這總歸是好事 —— 本着環保的態度,也應該儘可能減小消耗不是? :D mysql

現代操做碼緩存器(Optimizer+,APC2.0+,其餘)使用共享內存進行存儲,而且能夠直接從中執行文件,而不用在執行前「反序列化」代碼。這將帶來顯着的性能加速,一般下降了總體服務器的內存消耗,並且不多有缺點。 git

2. Optimizer+ 與 APC 的優缺點對比

Optimizer+ 於 2013年3月中旬更名爲 Opcache。 github

根據 PHP wiki 上的討論,Zend Opcache 即將整合到 php 5.5 中。做爲 APC 的競爭對手,新生的 Zend Opcache 頗有可能取代 APC 的位置,雖然 OptimizerPlus 沒有象 APC 那樣的 user cache 功能。 sql

OPTIMIZER+ 相對 APC 的優勢

  1. 性能。根據測試,Zend Optimizer+ 始終優於 APC。隨代碼差別,每秒鐘處理的請求數高 5~20%。Google doc 上記錄的測試結果中,WordPress 2.1.1(不知道爲何不用個新版本的 WP 來測試),性能提升約 8%。理論上來講,對於 WP 3.5.1,性能應該也能獲得大約 5~10% 的提高吧。對於運行 WordPress 的服務器而言,使用 Optimizer+ 能夠顯著下降 CPU 使用率和提升頁面加載速度(graphics here)。
  2. 支持新的 PHP 版本。Zend 和 PHP 社區都會幫助 Optimizer+ 可以支持最新版本的 PHP。
  3. 可靠性。Optimizer+ 擁有可選的損壞檢測能力,能夠防止因數據損壞而致使的服務器崩潰。
  4. 更好的兼容性。PHP 社區打算讓 Optimizer+ 與社區支持的全部 PHP 版本相兼容。

APC 相對 OPTIMIZER+ 的優點

  1. APC 有數據緩存 API,而 Optimizer+ 沒有。
  2. 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 —— 若是你用了這個加速模塊的話。 centos

從源碼安裝並配置

Zend Opcache 的源代碼託管在 github 上,目前仍是叫作 ZendOptimizerPlus緩存

安裝步驟詳見其 README 文件。 服務器

注意: ide

  1. 最好在本地虛擬機裏測試以後再部署到本身的服務器上;
  2. 安裝前最好先刪除 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 也不是什麼壞事。

操做步驟:

  1. 配置使用 epel 安裝源。已有則跳過。
  2. 刪除 eaccelerator、xcache、apc:
    yum remove php-eaccelerator php-xcache php-apcu

    沒有使用則跳過。

  3. 對系統執行升級:
    yum update

    目的是根據 remi 安裝源的狀態升級當前的 php 等軟件到 remi 支持的最新版本。此時,能夠看到系統有相似下面的輸出:

    Updating   : php-common-5.4.14-1.el6.remi.i686                                                         1/26
    
    WARNING : These php-* RPM are not official Fedora / Red Hat build and
    overrides the official ones. Don't file bugs on Fedora Project nor Red Hat.
    
    Use dedicated forums http://forums.famillecollet.com/
    
    warning: /etc/php.ini created as /etc/php.ini.rpmnew
      Updating   : mysql-libs-5.5.31-1.el6.remi.i686                                                         2/26
    
    WARNING : This MySQL RPM is not an official Fedora / Red Hat build and it
    overrides the official one. Don't file bugs on Fedora Project nor Red Hat.
    Use dedicated forums http://forums.famillecollet.com/
    
    warning: /etc/my.cnf created as /etc/my.cnf.rpmnew

    表示咱們如今要從 Fedora / Red Hat 的版本遷移到 Remi 版本了,因此不要去 Fedora / Red Hat 尋求幫助了。呵呵,貌似出問題都是在網上找,還真是不多到官方論壇裏提問。像我這樣的入門級用戶,也不會遇到那麼深度的問題。

  4. 安裝 Zend Opcache(pecl 版本):
    yum install php-pecl-zendopcache

    安裝時產生的 opcache 的配置文件位於默認的 /etc/php.d 目錄中:

    opcache-default.blacklist
    opcache.ini

    這個配置文件採用的基本就是 README 中的推薦設置,只有幾個地方須要修改。

    vi /etc/php.d/opcache.ini

    對照以下推薦配置修改並保存便可(可參考完整的 Zend Opcache 配置信息):

    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60
    opcache.fast_shutdown=1
    opcache.enable_cli=1
  5. 不須要修改 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 Group
Zend 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 的效果如何?若是您有興趣,不妨留言寫下您的測試結果。©

相關文章
相關標籤/搜索