WordPress HTTP请求空字节问题:是否存在序列化限制及配置方法?
问题背景
使用以下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

