Android向新Web服务器提交大POST数据丢失问题求助
问题:Android提交大体积POST数据至PHP-FPM时丢失,iOS无异常
环境背景
- 旧服务器:CentOS 7 + Apache 2.4.6 + PHP 7.3.33(mod_php)
- 新服务器:Alma Linux 9 + Apache 2.4.57 + PHP 8.0.30(PHP-FPM)
- 客户端:iOS/Android应用向Web应用提交POST数据,Android端代码未做任何修改
问题现象
- 新服务器仅对Android提交的大体积POST数据出现异常:数据量≥7900字节时,PHP无法获取POST内容,
$_POST数组为空,php://input也为空;≤7800字节时正常 - iOS提交任意长度数据均无异常
- Apache访问日志显示POST请求状态码为200,无重定向;Android应用可正常接收服务器响应文本,但服务端脚本无法读取POST数据
- 测试覆盖Android 7、12、14版本,问题表现一致
- 切换HTTP/HTTPS、简化POST数据格式(如
test=aaaaa...)均无法解决问题
已完成排查
- 已将
/etc/php.ini中upload_max_filesize和post_max_size设置为远大于需求的值,且确认配置生效(设置过低时Apache错误日志会触发“POST Content-Length exceeds the limit...”错误),当前无该类错误 - 未手动设置Apache的
LimitRequestBody指令,默认值为1GB,且无触发该限制的错误日志 - 通过tcpdump验证,Android提交的所有POST数据均已到达服务器
- 排除超时问题:客户端能正常收到响应,问题仅与数据长度相关
- 确认服务器未使用Nginx,仅通过Apache配置虚拟主机与日志
Android提交数据代码(SDK 33)
val data = "test=" + "a".repeat(7900) var request: HttpURLConnection? = null var responseCode = 0 try { request = url.openConnection() as HttpURLConnection responseCode = request.responseCode } catch (e: IOException) { e.printStackTrace() this.error = "bad_request" return false } request.connectTimeout = (this.timeoutLength * 1000).roundToInt() if ((method == "POST") && (data != null)) { try { request.doOutput = true request.setChunkedStreamingMode(data.length) val outputStream = request.outputStream val outputStreamWriter = OutputStreamWriter(outputStream) val outputWriter = BufferedWriter(outputStreamWriter) var next = 0 var chunkLength = 512 val totalLength = data.length this.publishProgress(0, totalLength) while (next < totalLength) { if (next + chunkLength > totalLength) { chunkLength = totalLength - next } outputWriter.write(data, next, chunkLength) this.publishProgress(next, 0) next += chunkLength } outputWriter.close() outputStreamWriter.close() } catch (e: IOException) { e.printStackTrace() this.error = "bad_post_data" return false } } try { this.publishProgress(0, request.contentLength) val inputStream = request.inputStream val chunk = ByteArray(4096) var chunkSize = -1 while (inputStream.read(chunk).also { chunkSize = it } != -1) { try { this.response.write(chunk, 0, chunkSize) publishProgress(this.response.size(), 0) } catch (e: OutOfMemoryError) { this.error = "out_of_memory" inputStream.close() return false } } inputStream.close() if (this.response.size() == 0) { this.error = "bad_response" return false } } catch (e: Exception) { e.printStackTrace() if (e.toString().contains("UnknownHostException")) { this.error = "offline" } else if (e.toString().contains("SocketTimeoutException")) { this.error = "timeout" } else { this.error = "bad_response" } return false } finally { request.disconnect() }
PHP接收脚本顶部代码
$rawdata = file_get_contents("php://input"); error_log($rawdata); // [empty] error_log(count($_POST)); // 0
请求排查思路或解决方案
恳请提供针对该问题的排查方向或解决办法,重点关注新服务器环境(Apache+PHP-FPM)中可能影响Android大体积POST数据接收的配置项。
内容的提问来源于stack exchange,提问作者arlomedia
相关产品推荐
相关产品推荐

