天天看點

将php的session儲存到記憶體中

今天一直在研究如何将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() 函數編碼過的腳本。