周三, 2009-03-04 20:42 — jason
XCache 是一個又快又穩定的 PHP opcode 緩衝器. 經過良好的測試並在大流量/高負載的生產機器上穩定運行. 經過(linux上)測試並支援所有現行 PHP 分支的最新
發布版本, 如 PHP4.4 PHP5.2, 並支援安全執行緒。 與同類 opcode 緩衝器相比更勝一籌, 比如能夠快速跟進 PHP 版本. 詳情請參考http://xcache.lighttpd.net/介紹.
下面說說Xcahce的2個特點:
將PHP代碼進行編譯(表現類似於.NET和JAVA的編譯,內部機制不同),這樣可以不用重複讀取PHP檔案,加速整個程式的運行效率;
可以快取資料到記憶體中,直接可以方便調用,例如你的一些不會經常改動的資料,只用一次從資料庫讀取出來後儲存到Xcache中,就不用再去使用資料庫了(這個是理想環境下)。
安裝之前先說下我的測試環境:winxp+apache2.2.8+PHP5.2.5+mysql5.0.45
裡可以下載你所需要的相應版本:http://xcache.lighttpd.net/wiki/Release-1.2.2
這裡要說明一下在windows下可能會遇到的問題:
不管你使用IIS或者Apache,如果使用FAST-CGI方式的話,下載XCache 1.2.2 for php 5.2.5-nts,特別注意的是必須設定C:/Windows/Temp的User或相關使用者可讀寫的許可權。
如果你windows上的Apache不是用的FAST-CGI方式,就下載XCache 1.2.2 for php 5.2.5
註:我們一般的安裝方式都是非FAST-CGI方式的,所以就直接下載XCache 1.2.2 for php 5.2.5就好了。再有一點,目前XCache 1.2.2還不支援PHP5.2.6,所以只能用PHP5.2.5安裝!
如何設定Windows上的Apache載入PHP的方式:
開啟Apache目錄下的conf/httpd.conf,找到 LoadModule php5_module
FAST-CGI方式設定:
LoadModule php5_module "D:/Program Files/php-apache/php5apache2_2_filter.dll"
非FAST-CGI方式設定:
LoadModule php5_module "D:/Program Files/php-apache/php5apache2_2.dll"
注意:關於MYSQL資料庫的安裝,在windows下使用該模式切記別裝mysql-5.1.26-rc-win32.exe
否則會出現可以載入MYSQL,卻無法使用的問題,Apache會自動掛掉!
將你的Xcache下載檔案解壓,解壓後有個Release_Ts檔案夾,把這個檔案夾下的php_xcache.dll放到你的PHP的ext目錄下。
比如我的PHP檔案安裝在D盤,我用如下路徑:D:/php/ext/php_xcache.dll。
接著將Release_Ts檔案夾的xcache.ini內容拷貝到php.ini中的最後面,下面展示一下我的配置,以及各個配置的相關說明。 配置如下:
[xcache-common]
;; 安裝成 zend extension (推薦), 路徑一般是 "$extension_dir/xcache.so"
;; zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
;; Windows 系統例子:
;;zend_extension_ts = D:/php/ext/php_xcache.dll
;; 或者您也可把 XCache 安裝成 extension, 注意確保您的 extension_dir 設定正確, 並把 xcache.so 或者 php_xcache.dll 放到該目錄裡面
; extension = xcache.so
;; 或者 Win32 系統:(注意:因為我已經設定了extension_dir,所以如下的設定是正確的,如果沒有配置extension_dir,需要用zend_extension_ts)
extension = php_xcache.dll
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "username"
; xcache.admin.pass = md5($您的密碼)
xcache.admin.pass = "password"
[xcache]
; 這裡的多數選項僅在 ini 裡可以修改, 這裡列出的都是預設值, 除非另外說明
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; 禁用: xcache.size=0
; 啟用: xcache.size=64M 之類 (任意>0的值) 同時請注意您的系統 mmap 上限
xcache.size = 64M
; 建議設定為 cpu 數 (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
; 只是個參考值, 您可以放心地儲存多於此數量的項目(php指令碼/變數)
xcache.slots = 8K
; 快取項目的 ttl, 0=永久
xcache.ttl = 0
; 掃描到期項目的時間間隔, 0=不掃描, 其他值以秒為單位
xcache.gc_interval = 0
; 同上, 只是針對變數緩衝設定
xcache.var_size = 32M
xcache.var_count = 1
xcache.var_slots = 8K
; 預設, 允許 ini_set()
xcache.var_ttl = 0
; 最大ttl值
xcache.var_maxttl = 0
xcache.var_gc_interval = 0
; 僅測試用
xcache.test = Off
; /dev/zero 時無效
xcache.readonly_protection = Off
; 對於 *nix 系統, xcache.mmap_path 是檔案路徑而不是目錄, (可以不存在 但是必須能建立).
; 如果您期望啟用 ReadonlyProtection, 可以使用類似 "/tmp/xcache"
; 2 個 php 組不會共用同一個 /tmp/xcache
; 對於 Win32 系統, xcache.mmap_path=匿名MAP名字, 不是檔案路徑. 建議使用 XCache 字眼避免跟其他軟體衝突
xcache.mmap_path = "zero"
; 僅用於 *nix 系統
; 設定為空白(禁用) 或者類似 "/tmp/phpcore/"
; 注意該目錄應該能被 php 寫入檔案 (跟 open_basedir 無關)
xcache.coredump_directory = ""
; 下面的項目開啟後將實現PHP代碼緩衝
xcache.cacher = Off
xcache.stat = Off
xcache.optimizer = Off
[xcache.coverager]
; 如果 xcache.coveragedump_directory 設定為空白則本設定自動為 Off
xcache.coverager = Off
; 請確保本目錄能被 coverage viewer 指令碼讀取 (注意 open_basedir)
; 依賴於 xcache.coverager=On
xcache.coveragedump_directory = ""
下面對上面配置資訊裡的一些代碼進行詳細解釋
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "username"
; xcache.admin.pass = md5($您的密碼)
xcache.admin.pass = ""
這段代碼是針對Release_Ts目錄下的admin檔案夾設定的,把admin檔案夾拷貝到apache的文檔目錄裡,直接存取http://localhost/admin,會跳出一個對話方塊,讓你輸入使用者名稱和密碼。這個使用者名稱和密碼就是為了這個對話方塊登陸設定的。注意密碼是需要MD5加密以後的字串,而不是明文。進入的頁面主要是監控xcache的頁面。
xcache的ini檔案配置參考
http://xcache.lighttpd.net/wiki/XcacheIni
http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps1/
配置完成以後,重啟你的web伺服器(IIS 或者 Apache),查看phpinfo(),就可以看到Xcache已經被載入了。
下面是配置好的XCACHE圖
這裡要注意的一點就是Xcache只能緩衝預設的一些對象,如int, string, array等,不能緩衝對象,否則讀取的時候就會報錯。
如果你非要緩衝對象的話也有辦法就是將對象序列化,讀取的時候再還原序列化一次。
下面我寫的一個Xcache的簡單類:
程式碼
<?php
/**
* Xcache moudle
*/
class cacheHelper{
public $prefix;
function __construct(){
if(!function_exists('xcache_get')){
exit("This application must required XCache module.");
}
}
/**
* __set
*
* @param mixed $name
* @param mixed $value
* @access public
* @return void
*/
public function __set($name, $value){
xcache_set($this->prefix.$name, $value);
}
/**
* __get
*
* @param mixed $name
* @access public
* @return mixed
*/
public function __get($name){
return xcache_get($this->prefix.$name);
}
/**
* __isset
*
* @param mixed $name
* @access public
* @return bool
*/
public function __isset($name){
return xcache_isset($this->prefix.$name);
}
/**
* __unset
*
* @param mixed $name
* @access public
* @return void
*/
public function __unset($name){
xcache_unset($this->prefix.$name);
}
}
?>
需要借鑒的幾篇文章
http://hi.baidu.com/binarie/blog/item/619ccf0efedd19e336d122bd.html
http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps1/
======================================================
面向高負載的架構Lighttpd+PHP(FastCGI)+Memcached+Squid
December 21st, 2006 Michael Posted in 其他技術, 西拉東扯 6,855 views
因新項目,開始從Apache上轉移到Lighttpd上,同時還有Memcached的大量使用,藉此機會把toplee.com的伺服器環境也進行一些改造,順便整理一份文檔留存!
更多大型架構的經驗,可以看我之前的一篇blog:http://www.toplee.com/blog/71.html
12.31 截至今天完成以下內容:
1. 完成lighttpd的安裝配置,並且做了大量的最佳化;
2. 幾乎全部看完了http://trac.lighttpd.net/trac/wiki上的文檔;
3. 配置了lighttpd和php的fastcgi支援;
4. 增加了php對XCache的支援;
5. 設定了部分網域名稱在lighttpd上的解析;
6. 完成了Apache通過mod_rewrite和mod_proxy將部分網域名稱以及全部的php訪問轉到lighttpd上;
7.完成Memcached的環境搭建,並且修改了部分資料庫操作緩衝到MC上;
效果:
1. 系統負載變低了不少,響應速度得到提升;
2. MC的效果非常理想,資料庫壓力得到很大減輕。
TODO:
(下面的事情等我買了第二台伺服器後進行,目前僅在幫朋友的項目上這麼幹了)
-. 配置MySQL的Master/Slave模式,把對資料庫的Write和Read進行分開
-. 加入squid群進行緩衝加速
-. 其他(比如DNS負載平衡加LVS的四層交換…)
To be continued…