最近我的網站訪問在直線上升,因為動態會員遊戲網站,一直在想辦法做些最佳化,今天想到如果把php的session放在記憶體,可能會提升網站的訪問速度。於是開始搜尋資料。經過一天的摸索,終於搞定。問題主要出在php有兩個memcache模組,一個是php-memcache,一個是php-memcached,php-memcached是最新的,也是比較穩定的,網上的資料都是關於php-memcache的,而沒有提到php-memcached,而php-memcached的配置跟php-memcache是有所不同的。大致的整個安裝過程:
1、安裝libevent 1.4.10
wget http://monkey.org/~provos/libevent-1.4.10-stable.tar.gz
tar xzvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.10-stable
./configure --prefix=/usr
make && make install
2、安裝memcached1.2.8
wget http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz
tar -zxvf memcached-1.2.8.tar.gz
cd memcached-1.2.8
./configure --with-libevent=/usr
make && make install
3、安裝zlib
wget http://www.zlib.net/zlib-1.2.3.tar.gz
tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --prefix=/usr --shared
make && make install
4、安裝libmemcached
wget http://download.tangent.org/libmemcached-0.26.tar.gz
tar zxvf libmemcached-0.26.tar.gz
cd libmemcached-0.26
./configure --prefix=/usr/local/libmemcached/
make && make install
5、安裝php-memcached模組
wget http://pecl.php.net/get/memcached
tar -zxvf memcached-0.1.5.tgz
cd memcached-0.1.5
phpize
./configure --with-php-config=/usr/bin/php-config --enable-memcache --with-libmemcached-dir=/usr/local/libmemcached
make && make install
6、啟動memcached
/usr/local/bin/memcached -p 11211 -l 127.0.0.1 -d
執行後,可以用以下辦法查看執行狀態
telnet 127.0.0.1 11211
stats
STAT pid 11568
STAT uptime 5910
STAT time 1241876672
STAT version 1.2.8
STAT pointer_size 32
STAT rusage_user 0.751885
STAT rusage_system 1.584759
STAT curr_items 2615
STAT total_items 36753
STAT bytes 244835
STAT curr_connections 3
STAT total_connections 18427
STAT connection_structures 36
STAT cmd_flush 0
STAT cmd_get 18388
STAT cmd_set 38334
STAT get_hits 15717
STAT get_misses 2671
STAT evictions 0
STAT bytes_read 4924864
STAT bytes_written 1992526
STAT limit_maxbytes 134217728
STAT threads 2
STAT accepting_conns 1
STAT listen_disabled_num 0
END
有以上資訊出現,表明啟動成功!
7、加入開機啟動
nano /etc/rc.d/local.d
加一行
/usr/local/bin/memcached -p 11211 -l 127.0.0.1 -d
8、編輯php.ini
nano /etc/php.ini
在檔案最後加入:
extension = "memcached.so"
修改
session.save_handler = files -> session.save_handler = memcached
session.save_path = "/var/lib/php/session" -> session.save_path = "127.0.0.1:11211"
9、重啟apache
service httpd restart
大功告成!
需要注意的地方主要有2點,
1、安裝libmemcached需用到zlib,我機器沒有這個,花了很多時間找編譯libmemcached時出錯的原因。
2、php.ini檔案的配置,php-memcached模組跟php-memcache不同,要設成是memcached,這個在phpinfo頁面的Registered save handlers可以看到。如果設定不正確,會有"Cannot find save handler memcache"的錯誤提示。
3、session.save_path幾乎所有的資料都是session.save_path = "tcp://127.0.0.1:11211",但這可能在memcaceh是這樣用的,我沒有驗證,我一開始也是這樣設定,但一直出現"Failed to write session data (memcached)"的錯誤,找了很入也沒找到是什麼原因,後來在php.net上找到
session.save_path string
Defines a comma separated of hostname:port entries to use for session server pool, for example "sess1:11211, sess2:11211".
這段說明,於是去掉tcp://再試,才終於成功!
最後:因為網站一直在啟動並執行,建議不要直接動php.ini,
直接用一個php檔案來測試
<?
ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.1:11211");
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>
只要這個檔案沒有出現錯誤提示了,就可以直接修改php.ini相應的內容,然後重啟apache,就樣就不影響會員訪問網站。