当 Session 以文件形式保存时,默认是保存在硬盘的一个目录下,当 Session 比较多时,磁盘读取文件会比较慢,通常一个目录下文件数量超过 2000 个时,读写这个目录就会比较慢。此时可以考虑将 Session 分目录存放。session.save_path 有一个可选的 N 参数来决定 Session 文件分布的目录深度,格式是:
session.save_path = "N;MODE;/path"
N 表示要设置的目录级数,MODE 表示目录的权限属性,默认为 600(Windows 中不需要设置),/path 表示 Session 文件存放的根目录路径每一级目录分别以 0 – 9 和 a – z 共 36 个字符作为目录名,这样存放 Session 的目录可以达到 36^36 个。创建文件夹的工作需要 PHP 来完成。
例如,2 级目录即 N = 2 时可以这样设置:
<?php
//设置Session目录分级与保存路径
ini_set('session.save_path', "2;600;/tmp/php/session");
//创建2级目录
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
for($i = 0; $i < $length; $i++) {
for($j = 0; $j < $length; $j++) {
createfolder('/tmp/php/session/'.$string[$i].'/'.$string[$j]);
}
}
function createfolder($path) {
if(!@file_exists($path)) {
createfolder(@dirname($path));
@mkdir($path, 0777);
}
}
session_start();
$_SESSION['name'] = 'dee';
echo session_id();
也可以修改php-fpm的conf配置文件(默认叫 www.conf,找找你的/etc下),我这是php8.1的版本:
php_value[session.save_path] = "2;600;/tmp/php/session"
这里你要确保/tmp/php/session这目录是存在的,并且是可以被php-fpm进程所访问的。保存文件重启以后,也可以仅手动执行一遍创建2级目录的动作:
znl.pub:~# cd /tmp/php/session
znl.pub:/tmp/php/session/# php81 -a
输入:
function createfolder($path) {
if(!@file_exists($path)) {
createfolder(@dirname($path));
@mkdir($path, 0777);
}
}
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
for($i = 0; $i < $length; $i++) {
for($j = 0; $j < $length; $j++) {
createfolder('./'.$string[$i].'/'.$string[$j]);
}
}
接下来可以测试一下了。