You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:44:54