RedHat服务器PHP应用调用session_start()报错:文件名过长(36)
解决session_start()因文件名过长报错的问题
错误现象
session_start(): open(/tmp/sess_CGr5ZiSQDdHxDm685fm5VX7,bPAfwVW841U9OKDZxObglASxB1uQFE,3csTnWpecsq7Nxvdw9NkZLvhEWs3lrLAWtLHWbMfcmK,G2vg9,i2cyHu6m1o,WsjMfKvcmkrYRQmbWqf,cz0O31IJdPSkwbXcsYldjiptc6UTTShW8TQb7-k2slvtt7GKEz5MVLofDg8TqP4bbBP7q24Wx,4Nh52sgpUfYwkycD3OJycyPbQFcKRfLR0yXVTToBfVKHlI, O_RDWR) failed: File name too long (36)
从错误信息能看到,生成的session文件名包含大量逗号,明显是畸形的session ID导致文件名超长,并非单纯的session.save_path权限问题。
排查与解决步骤
- 检查业务代码中的session ID自定义逻辑:确认是否在
session_start()前调用了session_id($custom_id),且$custom_id被错误拼接了多个值(比如数组转字符串、多参数拼接),导致session ID带逗号且超长。若有这类代码,修正为生成仅含字母数字和-、_的短ID(默认长度26)。 - 检查前端Cookie的
PHPSESSID值:通过浏览器开发者工具查看Cookie面板,确认PHPSESSID是否为带逗号的超长字符串。若是,清空该Cookie让PHP重新生成合法ID,同时排查前端代码是否错误修改了PHPSESSID的值。 - 临时应急修复:在
session_start()前添加过滤逻辑,清除畸形session ID:if (isset($_COOKIE['PHPSESSID']) && (strlen($_COOKIE['PHPSESSID']) > 40 || strpos($_COOKIE['PHPSESSID'], ',') !== false)) { unset($_COOKIE['PHPSESSID']); } session_start(); - 检查php.ini配置:确认
session.sid_length是否被改为异常大的值(默认26),若有则改回默认;同时检查session.hash_function等session ID生成相关配置是否正常。 - 排查Php-fpm环境:查看Php-fpm配置文件(如
www.conf),确认是否设置了env[PHP_SESSION_ID]这类环境变量,导致session ID被强制设为异常值。
内容的提问来源于stack exchange,提问作者el sparrow
相关产品推荐
相关产品推荐

