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

WordPress HTTP请求空字节问题:是否存在序列化限制及配置方法?

WordPress wp_remote_post 发送数据出现空字节填充问题的排查与解决

问题背景

使用以下WordPress代码发送数据时:

if ( intval( $form_id ) === $postform ) {
    $jsondata = json_encode( $form_data_array );
    $postdata = [
        'method'      => 'POST',
        'timeout'     => 60,
        'httpversion' => '1.1',
        'blocking'    => false,
        'headers'     => [
            'Content-Type' => 'application/json',
            'Expect' => '',
        ],
        'sslverify'   => true,
        'body'        => $jsondata,
        'data_format' => 'body',
    ];
    $response = wp_remote_post( $postto, $postdata );
}

出现异常:生成的$jsondata约60k字符,但接收端读取到的数据以{"fields":开头、}结尾,结尾前约40k字节为空字节;直接传递$form_data_array时也存在相同现象,约2/3数据被空字节填充。

可能原因及对应解决方案

1. 内容长度头部计算偏差

当未手动指定Content-Length时,WordPress HTTP底层自动计算的长度可能与实际JSON字符串长度不匹配,导致接收端按计算长度分配缓冲区,未填充的部分被空字节填充。

解决:手动计算并添加Content-Length头部:

$jsondata = json_encode( $form_data_array );
$postdata = [
    'method'      => 'POST',
    'timeout'     => 60,
    'httpversion' => '1.1',
    'blocking'    => false,
    'headers'     => [
        'Content-Type'   => 'application/json',
        'Content-Length' => strlen( $jsondata ), // 明确指定内容长度
        'Expect'         => '',
    ],
    'sslverify'   => true,
    'body'        => $jsondata,
    'data_format' => 'body',
];
$response = wp_remote_post( $postto, $postdata );

2. HTTP/1.1分块编码处理异常

HTTP/1.1默认启用分块编码,若接收端对分块数据的拼接逻辑存在缺陷,可能导致数据缺失,剩余缓冲区被空字节填充。

解决:禁用分块编码,强制使用身份编码:

'headers' => [
    'Content-Type'       => 'application/json',
    'Content-Length'     => strlen( $jsondata ),
    'Transfer-Encoding'  => 'identity', // 禁用分块编码
    'Expect'             => '',
],

注:也可临时将httpversion改为'1.0'测试,HTTP/1.0不支持分块编码,但不建议长期使用。

3. PHP内存或输出缓冲区限制

若$form_data_array数据量较大,PHP内存限制不足可能导致json_encode或数据传输过程中截断,后续被空字节填充;残留的输出缓冲区内容也可能干扰请求体。

解决:

  • 调整PHP内存限制:
ini_set('memory_limit', '256M'); // 根据实际需求调整,比如512M
  • 清空输出缓冲区:
ob_clean(); // 在发送请求前执行,确保无残留输出

4. 数组自动序列化缺陷

直接传递$form_data_array时,WordPress会自动序列化为application/x-www-form-urlencoded格式,复杂嵌套数组或大字段可能引发序列化不完整。

解决:始终手动序列化为JSON并验证编码结果,避免依赖自动序列化:

$jsondata = json_encode( $form_data_array );
if (json_last_error() !== JSON_ERROR_NONE) {
    error_log('JSON编码错误:' . json_last_error_msg());
    // 此处可添加错误处理逻辑,比如终止请求
    return;
}

5. 接收端读取逻辑问题

部分接收端可能固定读取长度不足,或未正确处理完整请求体,导致剩余部分被空字节填充。

验证:在发送端保存待发送数据到本地,对比接收端数据确认问题环节:

file_put_contents('/tmp/sent_json_data.txt', $jsondata); // 临时保存发送内容

总结

优先排查内容长度头部设置和分块编码问题,这是此类空字节填充现象的核心诱因。同时确保JSON编码无错误,必要时通过本地文件验证数据完整性,排除接收端逻辑问题。

内容的提问来源于stack exchange,提问作者Greg Mattes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:12:46