Linux下PHP 5.6上传超64MB无POST变量问题求助
问题描述
Linux服务器上的LAMP栈(PHP 5.6)中,已将上传相关配置设为150MB,但64MB以下文件可正常上传,64MB以上文件无法处理:
- 上传8MB文件时,脚本在文件上传完成后执行,符合预期;
- 将
upload_max_filesize设为4MB时,脚本同样在上传后执行,$_FILES数组返回错误,符合预期; - 上传64MB以上文件时,脚本立即执行,但无POST信息传入,也无错误返回;浏览器需等文件上传完成后才显示脚本页面,/tmp目录未生成临时文件,文件仿佛上传到“虚空”。
请求头信息
Content-Type : multipart/form-data; boundary=---------------------------313526204030269522582777911024 Content-Length : 73273125
当前php.ini配置
memory_limit = 256M post_max_size = 150M upload_max_filesize = 150M max_execution_time = 300 max_input_time = 1000
Apache超时时间已设为300秒,排除超时问题,核心现象是脚本被提前触发但无数据传入。
解决思路
检查Apache
LimitRequestBody配置
该参数控制Apache允许的请求体最大大小,默认值为0(无限制),若被设置为67108864(64MB),会直接截断超过此大小的请求,导致PHP无法接收数据。需在Apache配置文件(httpd.conf或虚拟主机配置)中设置:LimitRequestBody 157286400 # 对应150MB,或设为0表示无限制修改后重启Apache生效。
排查mod_security模块限制
若启用了mod_security,其SecRequestBodyLimit和SecRequestBodyNoFilesLimit参数可能限制了请求体大小。检查mod_security配置文件,确保这两个参数值大于150MB,例如:SecRequestBodyLimit 157286400 SecRequestBodyNoFilesLimit 157286400调整后重启Apache。
确认PHP-FPM配置一致性(若使用PHP-FPM)
若采用PHP-FPM部署,需确保FPM对应的php.ini文件中post_max_size、upload_max_filesize配置与CLI版一致,同时检查:upload_tmp_dir是否指向有权限的目录(如/tmp,确保Apache/PHP-FPM进程有读写权限);request_terminate_timeout是否设置合理,避免请求被提前终止;
修改后重启PHP-FPM服务。
检查文件系统临时目录权限
确认/tmp目录权限为777,或确保运行PHP的进程(如apache、www-data用户)拥有该目录的读写权限。可执行命令:chmod 777 /tmp chown apache:apache /tmp # 若进程用户为apache测试绕过Apache环境
临时启动PHP内置服务器:php -S 0.0.0.0:8080直接通过该端口上传大文件,若能正常处理,说明问题根源在Apache配置而非PHP本身。
抓包分析请求完整性
使用tcpdump抓包验证客户端是否发送了完整的请求数据:tcpdump -i any port 80 -w upload_cap.pcap用Wireshark分析抓包文件,检查请求的Content-Length是否与实际传输的字节数一致,排查传输过程中是否存在中断或截断。
内容的提问来源于stack exchange,提问作者jmarcv

