php session 分目录存放

当 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"

file
这里你要确保/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]);
    }
}

接下来可以测试一下了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注