Fastcomet主机下Ajax传输1MB以上文本无法保存如何解决?
故障解决方向
1 检查PHP安全扩展限制
你使用的PHP5.6版本,多数共享主机默认安装了Suhosin安全扩展,该扩展会独立限制POST参数的长度,不受默认post_max_size控制,你需要在php.ini中添加以下配置:
; 单个POST参数值最大长度,设为512M suhosin.post.max_value_length = 536870912 ; 单个请求参数值最大长度,设为512M suhosin.request.max_value_length = 536870912
修改后需通过phpinfo()页面确认配置是否生效,部分共享主机会限制用户自定义php.ini的覆盖范围,若本地值未更新需联系主机商协助调整。
2 调整Web服务器上传限制
PHP上层的Web服务器会先拦截超过大小的请求,不会传递给PHP处理:
- 若使用Apache服务器,可在站点根目录
.htaccess文件中添加配置,放开请求大小限制:LimitRequestBody 536870912 - 若使用Nginx服务器,需调整
nginx.conf中的client_max_body_size 512M配置,该配置需联系主机商修改。
你可以通过浏览器开发者工具的「网络」面板查看请求返回的状态码,若返回413 Request Entity Too Large即可确认是该类问题。
3 优化传输逻辑绕过表单解析限制
当前你使用表单格式传输大文本,$_POST解析环节可能触发隐藏的长度限制,可改为直接传输原始文本:
修改后Ajax代码:
function AwaitSaveJsonZip ( filename , data ) { return $.ajax({ url: 'test_app_saveJson_1.php', type: 'POST', data: data , contentType: 'text/plain', // 文件名通过请求头传递 headers: { 'X-Filename': filename }, dataType: "text", }); }
修改后PHP保存逻辑:
// 从请求头读取文件名 $filename = $_SERVER['HTTP_X_FILENAME']; // 直接从输入流读取原始数据,绕过$_POST解析 $data = file_get_contents('php://input'); if(!file_put_contents ($filename , $data , LOCK_EX )) { print ("fail-" . $filename) ; }else { print ( "success-" . $filename ) ; }
4 快速定位问题环节
在PHP代码最开头添加以下调试代码,确认数据截断的位置:
// 打印POST参数中data的长度 var_dump(strlen($_POST['data'])); // 打印请求头声明的总内容长度 var_dump($_SERVER['CONTENT_LENGTH']); exit;
- 若
strlen($_POST['data'])远小于1.14M,说明数据在到达PHP前被截断,问题出在Web服务器或安全扩展配置 - 若两个长度一致,说明数据已经完整传入PHP,需检查磁盘配额、目录权限等存储相关问题
内容的提问来源于stack exchange,提问作者heliev
相关产品推荐
相关产品推荐

