CodeIgnitor中$_POST在特定请求场景下为空的问题求助
排查CodeIgniter接口multipart/form-data请求间歇性$_POST为空问题
问题背景
运行4年未改动的CodeIgniter应用,近10天出现接口异常:使用multipart/form-data发送带参数和附件的请求时,特定场景下$_POST为空、请求超时,具体现象:
- 连续快速调用时参数正常
- 修改参数后等待30秒再调用正常
- 修改参数后几秒内调用时,
$_POST无数据、请求超时,后续请求恢复正常
排查方向
1. 检查PHP文件上传与POST处理配置
因为涉及multipart/form-data上传,优先排查PHP核心配置是否被改动:
- 查看
php.ini中的以下参数:upload_tmp_dir:确认临时目录路径,检查该目录的磁盘空间(执行df -h)和权限(确保PHP进程用户如www-data有读写权限)post_max_size、upload_max_filesize:是否低于当前请求的参数+附件总大小max_input_time:是否过短,导致短时间内的请求无法完成POST数据解析
- 查看PHP错误日志(通常路径为
/var/log/php/error.log),是否有临时目录写入失败、POST数据截断等报错
2. 排查临时文件堆积问题
multipart/form-data请求会将上传文件写入临时目录,若临时文件未被及时清理,会导致新请求无法写入:
- 统计临时目录文件数量:执行
ls $(php -r "echo ini_get('upload_tmp_dir');") | wc -l,若文件数过多说明清理机制失效 - 检查系统是否有定时清理临时文件的任务(如
tmpwatch、systemd-tmpfiles),最近是否被禁用或配置变更
3. 检查PHP-FPM/服务器进程配置
服务器进程资源不足或超时配置变更,可能导致请求阻塞:
- 查看PHP-FPM配置(
php-fpm.conf或pool.d/www.conf):pm.max_children、pm.start_servers:是否设置过低,导致请求堆积pm.process_idle_timeout:是否过短,导致进程频繁重启,短时间内无法处理新请求request_terminate_timeout:是否设置过短,导致请求被提前终止
- 查看Nginx/Apache日志,是否有连接超时、进程不足的报错
- 检查服务器负载(执行
top、uptime),确认是否存在CPU/内存资源耗尽的情况
4. 排查CodeIgniter全局钩子或中间件
虽然代码直接使用$_POST,但CI可能存在前置钩子修改了POST数据:
- 打开
application/config/hooks.php,检查pre_controller、post_controller_constructor等钩子,确认是否有处理POST数据的逻辑,是否存在条件性清空$_POST的代码 - 检查CI的
config.php中$config['global_xss_filtering']是否开启,若开启,CI会自动过滤POST数据,排查是否存在异常过滤的情况
5. 验证日志写入函数的阻塞问题
write_to_log函数可能因文件锁导致进程阻塞:
- 临时注释
write_to_log($json_request);代码,测试问题是否消失 - 检查日志文件的权限和写入逻辑,是否使用了排他锁(如
flock)且未正确释放,导致短时间内的请求等待锁释放而超时
6. 排查网络层配置变更
最近服务器的网络配置(防火墙、负载均衡)可能变更:
- 检查Nginx/Apache的
client_body_timeout、client_header_timeout配置,是否过短导致请求被判定为超时 - 确认负载均衡是否开启了会话保持,是否存在某节点异常导致部分请求失败
- 检查防火墙规则,是否对短时间内的重复请求进行了拦截
内容的提问来源于stack exchange,提问作者Hussain Akbar
相关产品推荐
相关产品推荐

