PHP 7.2将Session垃圾回收由概率触发强化为“至少每100次请求执行一次”,使gc_probability/gc_divisor更稳定生效;ThinkPHP5若未设'gc_probability'=>0仍沿用该机制,且Session::clear()清空$_SESSION但不调用session_write_close(),后续写入易致headers错误。

PHP7.2对ThinkPHP5 Session机制的底层支撑变化
PHP7.2将Session垃圾回收逻辑从概率触发改为更可控的定时清理策略,这直接影响ThinkPHP5中session.gc_probability和session.gc_divisor的实际生效方式。
在PHP7.2之前,session.gc_probability默认为1、gc_divisor为100,意味着每次请求有1%概率触发GC;而PHP7.2起,该机制被强化为“至少每100次请求执行一次”,实际触发更稳定。ThinkPHP5若未显式配置'gc_probability' => 0,仍会沿用PHP原生行为,但GC频率已不可逆提升。
必须注意:ThinkPHP5的Session::clear()方法在PHP7.2环境下会同步清空$_SESSION超全局变量,但不会主动调用session_write_close()——若后续代码仍有session写入操作,可能引发“headers already sent”错误。
ThinkPHP5在PHP7.2中Session初始化的兼容性调整
方法一:自动启动模式保持不变
立即学习“PHP免费学习笔记(深入)”;
当配置'session' => ['auto_start' => true]时,ThinkPHP5仍会在首次调用Session类时自动执行session_start()。但PHP7.2要求session_start()必须在任何输出前调用,【若控制器中存在echo或var_dump等前置输出,将直接报错终止】。
方法二:手动控制启动时机
在App.php或中间件中显式调用session_start(),可绕过ThinkPHP5的自动初始化流程。这种方式能精准控制Session开启时机,避免因框架加载顺序导致的header冲突。
Session存储驱动在PHP7.2下的行为差异
第一步:确认当前驱动类型
查看config/session.php中'type'配置项,常见值为'file'、'redis'、'memcache'。
第二步:验证file驱动路径权限
PHP7.2默认启用open_basedir限制,若runtime/session目录不在允许路径内,Session文件将无法写入。此时ThinkPHP5不会抛出明确异常,而是静默失败——所有set操作看似成功,但get始终返回null。
第三步:Redis驱动需升级扩展
PHP7.2废弃了旧版redis扩展(phpredis



















