Debian Linux 的 PHP session 之前都存在 /var/lib/php5/, 某次升級後, 就轉移到 /tmp 去.
可以修改 php.ini 的 session.save_path 指回 /var/lib/php5, 只是總覺得不是好解法.
看 RAM 還夠用, 還是乾脆把 session 都存到 memcached 去好了.
memcached 安裝
- apt-get install memcached php5-memcache
修改 PHP 設定檔
有下述兩種做法, 我比較喜歡第二種(我不太喜歡去動原始設定, 避免升級時設定被蓋掉).
方法1
- vim /etc/php5/apache2/php.ini
session.save_handler = files
修改成
session.save_handler = memcache
; 127.0.0.1:11211 請自行修改成 memcached 的位置
session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
方法2
- vim /etc/php5/conf.d/sess.ini
; session for memcached
session.save_handler = memcache
; 127.0.0.1:11211 請自行修改成 memcached 的位置
session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
設定完成後
- /etc/init.d/apache2 restart
- rm /tmp/sess_*
- 有空時用下述程式看看 memcache 狀態 即可.
- /usr/share/memcached/scripts/memcached-tool 127.0.0.1:11211 stats
- /usr/share/memcached/scripts/memcached-tool 127.0.0.1:11211 display
- /usr/share/memcached/scripts/memcached-tool 127.0.0.1:11211 dump
PHP FPM 的設定方式
- vim /etc/php5/fpm/pool.d/www.conf
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15" - sudo /etc/init.d/php5-fpm restart
使用 PHP 看 memcache 狀態
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211);
$stats = $memcache->getStats();
foreach ($stats as $key => $val) {
echo "$key : $val\n";
}
?>
Memcache iptables (防火牆) 設定
- 開放 192.168.1.*, 其它全部擋掉.
- iptables -t filter -A INPUT -p tcp -m tcp -s 192.168.1.0/24 -d 192.168.1.0/24 --dport 11211 -j ACCEPT
若遇到 Unknown: Failed to write session data (memcache) 的問題:
- 請將 session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
- 改成 session.save_path="tcp://127.0.0.1:11211?persistent=0&weight=1&timeout=1&retry_interval=15"