今天一直在研究如何將session儲存到記憶體中去,我們先說一下為什麼要把session儲存到記憶體中去,有什麼好處呢。
因為如果我們的php程式中設定了session_start(),那麼每個訪問此檔案的人都會產生一個session檔案存在系統緩衝中/tmp目錄下,我們經常寫的購物車或者會員系統經常要使用到session,所以如果一個流量很大的網站或者session儲存時間設定很長的網站,就會在/tmp目錄下建立大量session檔案,雖然有時候這些檔案大小僅僅為0,可是它確實還是佔用了一個檔案控制代碼,我有一台伺服器因為設定的儲存時間太長了,結果產生了120多萬個session,佔用了硬碟所有的檔案控制代碼,導致再也不能建立新檔案了,我用了35個小時來刪除這120多萬個session,只要你設定了session_start(),伺服器會根據使用者本地的cookie尋找session的值,如果有儲存session檔案那麼取回session的值,如果沒有那麼建立立一個session檔案。可想而知,在120多萬個檔案中尋找你要的檔案,是多麼恐怖的事情啊,我用ll命令等幾分鐘都沒反應呢,所以太多的session檔案勢必造成系統運行緩慢,所以我想把session儲存到記憶體中去,這樣就可以大大加快session的讀寫速度,還可以減少硬碟的損耗,兩全其美啊。哈哈
我找到了很多文章說使用MM一個session使用共用記憶體的模組可以做這個工作,剛好ports裡面也有,我就安裝了一下,而且還按照說明重新編譯了php,並且把php.ini的session.save_handler = files改成了session.save_handler = mm,結果我不管怎麼調用還是抱錯說找不到save_handler mm,這可愁死我了,搞了一個早上,也沒找出問題所在。因為MM測試未成功,我這裡就不提供MM的安裝步驟了。
結果我在察看phpinfo的時候,偶爾在session那段發現了Registered save handlers = files user eaccelerator ,呵呵,原來是我安裝了eaccelerator,可能它和mm不能共存吧。我把session.save_handler = eaccelerator,重起apache後,運行正常。去/tmp下察看,確實不在產生新的session檔案了,哈哈。
另外需要提醒大家一點的就是,雖然session儲存到記憶體中有種種好處,但是如果使用apachectl restart,那麼記憶體中的session會丟失哦,所以不要動不動就重起apache。呵呵。
不知道eaccelerator和不會安裝eaccelerator的
什麼是 eAccelerator 。
eAccelerator 是一個開源並且免費的 PHP 加速器,最佳化器,編碼器,同時也能夠為 PHP 提供動態內容緩衝。它能夠將 PHP 指令碼緩衝為已編譯狀態以達到提升 PHP 指令碼運行效能的目的,因此傳統的先行編譯幾乎被消除。eAccelerator 也能夠最佳化 PHP 指令碼以提升 PHP 指令碼的執行速度。eAccelerator 可有效降低伺服器負載並且提高 PHP 程式速度達 1-10 倍。
TurckMMCache 是 eAccelerator 的前身。
( http://sourceforge.net/project/turckmm-cache/ by Dmitry Stogov )
eAccelerator 包含一個 PHP 編碼器和載入器。您可以使用編碼器對 .php 指令碼進行編碼,從而能夠以非原始碼方式發布您的 PHP 程式。經過編碼的 PHP 程式可以運行在任何安裝有PHP 解析環境和 eAccelerator 的網站上,由於編碼後的 PHP 程式儲存為已編譯代碼,並且已編譯版本中不包含程式的原始碼,因此,經過 eAccelerator 編碼的 PHP 程式是不能被還原恢複的。當然,一些內部指令碼可以被某些不同的反編譯引擎工具(如 disassemblers, debuggers等)進行還原恢複,但這並非是微不足道的。
eAccelerator 與 Zend Optimizer 載入器相容。在 php.ini 中,Zend Optimizer 必須在eAccelerator 之後載入。如果您的網站不運行任何經由 Zend 編碼器編碼的 PHP 指令碼,那麼我們並不推薦您在安裝 eAccelerator 的伺服器上安裝 Zend Optimizer。
eAccelerator 不能運行於 CGI 模式下,但它可以運行於像 lighttpd 類似的 Fast-CGI模式。
以下是一些與 eAccelerator 具有相同功能的產品:
- Zend Performance Suite (http://www.zend.com)
- Alternative PHP Cache (http://pecl.php.net/package/APC)
eAccelerator已經是很常用的PHP平台先行編譯加速的手段了,安裝後php執行速度大幅度提升,所以今天我們來學習從ports安裝eAccelerator,並且配置好它。 引用# cd /usr/ports/www/eaccelerator
make
make install clean
mkdir /tmp/eaccelerator
chown -R www /tmp/eaccelerator
chmod 0700 /tmp/eaccelerator
vi /usr/local/etc/php.ini
作為Zend擴充安裝設定檔
引用zend_extension="/usr/local/lib/php/20060613/eaccelerator.so"
[eaccelerator]
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
作為獨立模組安裝設定檔
引用[eaccelerator]
extension=”eaccelerator.so”
eaccelerator.shm_size=”0″
eaccelerator.cache_dir=”/tmp/eaccelerator”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=”"
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”0″
eaccelerator.shm_prune_period=”0″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
這個是ArthurXF,session全部放進記憶體中的配置,傾情奉獻給大家:
引用[eaccelerator]
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="900"
eaccelerator.shm_prune_period="1800"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.sessions="shm"
eaccelerator.keys="shm"
eaccelerator.content="shm"
如果上面兩個配置加上去了,都沒能啟動eAccelerator,那麼執行下面的命令:
vi /usr/local/etc/php/extensions.ini
在最後加入下面的語句即可
extension=eaccelerator.so
安裝好了,重起apache,看看phpinfo,是不是多了下面的內容啊。
with eAccelerator v0.9.5, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
這樣就說明安裝好了。
下面看看eAccelerator配置選項
eaccelerator.shm_size
指定 eAccelerator 能夠使用的共用記憶體數量,單位:MB。
"0" 代表作業系統預設。預設值為 "0"。
eaccelerator.cache_dir
使用者磁碟緩衝的目錄。eAccelerator 在該目錄中儲存先行編譯代碼、session 資料、內容等。
相同的資料也可以儲存於共用記憶體中(以獲得更快的存取速度)。預設值為 "/tmp/eaccelerator"。
eaccelerator.enable
開啟或關閉 eAccelerator。"1" 為開啟,"0" 為關閉。預設值為 "1"。
eaccelerator.optimizer
開啟或關閉內部最佳化器,可以提升代碼執行速度。"1" 為開啟,"0" 為關閉。預設值為 "1"。
eaccelerator.debug
開啟或關閉調試日誌記錄。"1" 為開啟,"0" 為關閉。預設值為 "0"。
eaccelerator.check_mtime
開啟或關閉 PHP 檔案改動檢查。"1" 為開啟,"0" 為關閉。如果您想要在修改後重新編譯 PHP
程式則需要設定為 "1"。預設值為 "1"。
eaccelerator.filter
判斷哪些 PHP 檔案必須緩衝。您可以指定緩衝和不緩衝的檔案類型(如 "*.php *.phtml"等)
如果參數以 "!" 開頭,則匹配這些參數的檔案被忽略緩衝。預設值為 "",即,所有 PHP 檔案
都將被緩衝。
eaccelerator.shm_max
當使用 " eaccelerator_put() " 函數時禁止其向共用記憶體中儲存過大的檔案。該參數指定允許
儲存的最大值,單位:位元組 (10240, 10K, 1M)。"0" 為不限制。預設值為 "0"。
eaccelerator.shm_ttl
當 eAccelerator 擷取新指令碼的共用記憶體大小失敗時,它將從共用記憶體中刪除所有在
最後 "shm_ttl" 秒內無法存取的指令碼緩衝。預設值為 "0",即:不從共用內春中刪除
任何快取檔案。
eaccelerator.shm_prune_period
當 eAccelerator 擷取新指令碼的共用記憶體大小失敗時,他將試圖從共用記憶體中刪除早於
"shm_prune_period" 秒的緩衝指令碼。預設值為 "0",即:不從共用內春中刪除
任何快取檔案。
eaccelerator.shm_only
允許或禁止將已編譯指令碼緩衝在磁碟上。該選項對 session 資料和內容快取無效判定。預設
值為 "0",即:使用磁碟和共用記憶體進行緩衝。
eaccelerator.compress
允許或禁止壓縮內容緩衝。預設值為 "1",即:允許壓縮。
eaccelerator.compress_level
指定內容緩衝的壓縮等級。預設值為 "9",為最高等級。
eaccelerator.name_sapce
一個所有鍵(keys)的前置詞字元串。如果設定該前置詞字元串則允許 .htaccess 或者 主配置
檔案在相同主機上運行兩個相同的鍵名。
eaccelerator.keys
eaccelerator.sessions
eaccelerator.content
判斷哪些鍵(keys)、session 資料和內容將被緩衝。可用參數值為:
"shm_and_disk" - 同時在共用記憶體和磁碟中快取資料(預設值);
"shm" - 如果共用記憶體用盡或者資料容量大於 "eaccelerator.shm_max"
則在共用記憶體或磁碟中快取資料;
"shm_only" - 僅在共用記憶體中快取資料;
"disk_only" - 僅在磁碟中快取資料;
"none" - 禁止快取資料。
eAccelerator 應用程式介面(API)
eaccelerator_put($key, $value, $ttl=0)
將 $value 儲存在共用記憶體中,並儲存 $tll 秒。
eaccelerator_get($key)
從共用記憶體中返回 eaccelerator_put() 函數所儲存的緩衝數值,如果不存在或者已經
到期,則返回 null。
eaccelerator_rm($key)
從共用記憶體中刪除 $key。
eaccelerator_gc()
刪除所有到期的鍵(keys)
eaccelerator_lock($lock)
建立一個指定名稱的鎖(lock)。該鎖可以通過 eaccelerator_unlock() 函數解除,在請求
結束時也會自動解鎖。例如:
<?php
eaccelerator_lock("count");
eaccelerator_put("count",eaccelerator_get("count")+1));
?>
eaccelerator_unlock($lock)
解除指定名稱的鎖(lock)。
eaccelerator_set_session_handlers()
安裝 eAccelerator session 控制代碼。
從 PHP 4.2.0 以後,您可以通過設定 php.ini 中的 "session.save_handler=eaacelerator"
安裝 eAccelerator 控制代碼。
eaccelerator_cache_output($key, $eval_code, $ttl=0)
在共用記憶體中緩衝 $eval_code 的輸出,緩衝 $ttl 秒。
可以調用 mmcach_rm() 函數刪除相同 $key 的輸出。例如:
<?php eaccelerator_cache_output('test', 'echo time(); phpinfo();', 30); ?>
eaccelerator_cache_result($key, $eval_code, $ttl=0)
在共用記憶體中緩衝 $eval_code 的結果,緩衝 $ttl 秒。
可以調用 mmcach_rm() 函數刪除相同 $key 的結果。例如:
<?php eaccelerator_cache_output('test', 'time()." Hello";', 30); ?>
eaccelerator_cache_page($key, $ttl=0)
緩衝整個頁面,且緩衝 $ttl 秒。例如:
<?php
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET),30);
echo time();
phpinfo();
?>
eaccelerator_rm_page($key)
從緩衝中刪除由 eaccelerator_cache_page() 函數建立的相同 $key 的頁。
eaccelerator_encode($filename)
返回 $filename 檔案經過編譯後的編碼。
eaccelerator_load($code)
載入被 eaccelerator_encode() 函數編碼過的指令碼。