PHP APC的設定與應用

最近在裝VM上面裝APC 3.1.9有遇到一些狀況,解決問題中又看到一些關於APC的簡報資料,就順便整理一下…

這次安裝遇到什麼問題呢?當我在我NB上的VM裝好APC 3.1.9後,執行任何PHP程式,都會出現下面錯誤 XD
Fatal error: Unknown: apc_fcntl_unlock failed: in Unknown on line 0

找了一下資料,原來是因為BUG。詳細說明 - PECL :: Bug #22688 :: Unknown: apc_fcntl_unlock failed。最下方有提供patch,不過需要自己改cource code。照者說明改source code,重新安裝後,問題就解決了!

其實,APC很好安裝。不過,重點不是安裝,而是必須思考整體,如何讓APC融入架構中,發揮最大的效用。因此找出幾篇覺得值得參考的簡報。

先說APC如何安裝?以我這次所用的VM,OS為FreeBSD,安裝步驟如下
cd /usr/ports/www/pecl-APC
make install

順道一提,開啟下面兩個選項任一個,我上述的問題也不會發生
  • --enable-apc-sem
  • --enable-apc-spinlocks
究竟要開啟哪些選項?下面會提到…

首先,補充幾點
  • APC裝好後,不需要在php.ini中設定啟用(apc.enabled="1")即可使用。如何調整設定讓效能更好?請看下面簡報內容。
  • apc.stat內定值為"1",也就是說每次都會檢查PHP是否曾異動過。設定apc.stat="0"後就不做檢查。因此可讓效能更好!設定雖然很簡單,可是卻需要完整的配套措施方可使用。
  • 內定,CLI不會開啟APC。可設定參數apc.enable_cli="1"啟用(設定後,php -i 才會看到 apc enable)
  • 如何清除opcode cache?一個是apache重新啟動,或者執行apc_clear_cache()
  • 下面簡報中提及參數apc.optimization,該參數已經被移除(Removed in APC 3.0.13)
  • apc.php會顯示圖片,記得要裝GD

PHP APC 簡報一
Improving PHP Application Performance with APC,這篇簡報,以簡單、明確的說明來介紹APC。提到的APC原理、參數設定、效用等等…

PHP APC 簡報二
如同上面的簡報,內容稍微更深入。利用圖表,來說明PHP如何被載入和執行,以及APC的工作原理和參數設定。看完後,應該對於PHP和APC會有更進一步瞭解。

PHP APC 簡報三
這篇簡報出自facebook,內容自然非常充實…除了介紹APC的原理、參數設定。並解釋參數的含意(如locking、hints、cache 等參數),並以實際的數據來闡述設定的差異。最後,還提到很多進階用法。仔細看內容,對於APC的應用一定會有些想法。如果,你的網站流量具有一定規模,這篇簡報非常值得一讀。
稍微整理一下,當中提到關於設定的部分
  • 使用spin lock
  • 使用ipc semaphore lock
  • lazy loading(參數為 apc.lazy_functions & apc.lazy_classes)

PHP APC 簡報四
下面這篇簡報,雖然也也介紹APC,但著墨不深。我會放於此,主要是內容主要在闡述cache的整體應用。以這個角度而言,這份簡報內容也值得一看。

其實,只要網站的流量成長到一定的規模後,資源就開始錙銖必較了。一支效能差的程式,在小流量時候是完全感受不到差異。但在大流量之下,嚴重時卻可能大幅拖垮整體效能。除了效能的調教外,各種、各階段的cache使用也很重要(當然還有其他事項)。如何減少硬體的負荷,讓既有硬體能夠提供更高的服務…

以APC來講,相同的流量和硬體下,讓我的主機CPU loading減少一半,hits達100%(數據僅供參考,這可能因為整體架構的不同,而有不同的數據結果)。這可以減少硬體成本支出,另外,少一台機器,就少一點耗電量。我們就不需要太多的核電廠、以及讓北極熊有充分的空間生存 :)

不過,千萬不要以為有了APC就可大幅提升效能。如果沒有整體的思考、整合與應用,效果還是可能會被侷限。畢竟,cache的hit是很重要的。

參考資料

留言