PHP.ini 配置文件详解
一、核心配置项解析
1. Session 存储配置
; 存储处理器设置
session.save_handler = files ; 默认文件存储,可选redis/memcached
session.save_path = "/tmp" ; 存储路径,建议改为安全目录:ml-citation{ref="3,6" data="citationList"}
; 使用分级目录示例(适合超大流量站点)
session.save_path = "2;/var/lib/php/sessions" ; 2表示目录层级深度:ml-citation{ref="6,10" data="citationList"}2. Cookie 安全设置
session.name = "APP_SESSID" ; 自定义Session ID名称(避免使用默认PHPSESSID)
session.cookie_secure = On ; 仅通过HTTPS传输(启用HTTPS后必须开启)
session.cookie_httponly = On ; 禁止JavaScript访问Cookie
session.cookie_samesite = "Lax" ; 防御CSRF攻击:ml-citation{ref="5,8" data="citationList"}3. 会话启动与有效期
session.auto_start = 0 ; 建议保持0,手动session_start()
session.cookie_lifetime = 1800 ; Cookie有效期(秒),0表示浏览器关闭失效
session.gc_maxlifetime = 1800 ; 服务器端数据有效期:ml-citation{ref="3,12" data="citationList"}4. 安全增强配置
session.use_strict_mode = 1 ; 拒绝未初始化的Session ID
session.use_only_cookies = 1 ; 禁用URL传递Session ID
session.hash_function = "sha256" ; Session ID哈希算法:ml-citation{ref="5" data="citationList"}5. 垃圾回收机制
session.gc_probability = 1 session.gc_divisor = 1000 ; 垃圾回收概率 = 1/1000
高流量站点建议设置为1/1000以减少性能开销
二、配置方法对比
优先级顺序:php.ini < .htaccess < ini_set() < session_start()参数
三、安全配置最佳实践
1. 存储安全
; Redis配置示例 session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379?auth=your_password"
2. 会话固定防护
session.use_strict_mode = 1 ; 拒绝客户端提供的未初始化ID session.use_trans_sid = 0 ; 禁止URL自动包含Session ID
3. Cookie强化
session.cookie_path = "/admin" ; 限制Cookie仅后台路径可用
session.cookie_domain = ".yourdomain.com" ; 跨子域共享会话:ml-citation{ref="8,12" data="citationList"}四、性能优化方案
1. 文件存储优化
; 使用多级目录存储(超过10万会话时) session.save_path = "2;/var/lib/php/sessions"
需手动创建目录结构并设置权限:
chmod -R 770 /var/lib/php/sessions chown -R www-data:www-data /var/lib/php/sessions
2. 内存存储方案
; Memcached配置 session.save_handler = memcached session.save_path = "localhost:11211?persistent=1&weight=1"
3. 读写优化
// 只读场景(减少文件锁定) session_start(['read_and_close' => true]);
五、常见问题解决方案
1. 会话不生效
检查
session.save_path目录权限(Web用户需有写权限)验证
session.auto_start=0时是否调用session_start()
2. 跨子域共享失败
session.cookie_domain = ".mydomain.com" ; 注意开头的点号
3. 垃圾回收失效
; 当使用层级目录存储时
session.gc_probability = 1
session.gc_divisor = 100 ; 恢复自动清理功能:ml-citation{ref="9" data="citationList"}4. 对象序列化问题
session.serialize_handler = "php_serialize" ; 处理复杂数据结构
修改php.ini后需重启Web服务器生效,而
ini_set()设置仅影响当前请求