PHP json_encode在json字符串的开头添加一些数字(十六进制?)
我将json_编码的数据从一个php脚本回显到另一个php脚本(请求由fsockopen/GET发出) 对一个包含40个元素的数组进行编码时,没有问题。当对41执行完全相同的操作时,一些数字和\r\n会添加到json字符串的开头 这是字符串的开头,就在我回显它之前:PHP json_encode在json字符串的开头添加一些数字(十六进制?),php,json,fsockopen,Php,Json,Fsockopen,我将json_编码的数据从一个php脚本回显到另一个php脚本(请求由fsockopen/GET发出) 对一个包含40个元素的数组进行编码时,没有问题。当对41执行完全相同的操作时,一些数字和\r\n会添加到json字符串的开头 这是字符串的开头,就在我回显它之前: {"transactions":[{"transaction_id":"03U191739F337671L", 以下是我发送数据的方式: header('Content-Type: text/plain; charset=utf-
{"transactions":[{"transaction_id":"03U191739F337671L",
以下是我发送数据的方式:
header('Content-Type: text/plain; charset=utf-8');
error_log(json_encode($transaction_list));
echo json_encode($transaction_list);
收到请求脚本中的数据后,我会将其再次打印到错误日志:
27fc\r\n{"transactions":[{"transaction_id":"03U191739F337671L",
如果检索到的数据较少,则“27fc\r\n”不存在
以下是我处理响应的方式:
$response="";
while (!feof($fp)) {
$response .= fgets($fp, 128);
}
//Seperate header and content
$separator_position = strpos($response,"\r\n\r\n");
$header_text = substr($response,0,$separator_position);
$body = substr($response,$separator_position+4);
error_log($body);
fclose($fp);
我已经尝试过在fsockopen请求的时间之外玩游戏,这没关系。php.ini中的max_execution_time和max_input_time也一样,这并不重要。我在想,内容在某种程度上可能因为超时而被删掉了
第41个数组的内容格式与前面的数组相同
发生了什么,我如何修复它
我正在使用Linux、Apache(httpd)和PHP
更新
数据似乎是分块的。响应中包含以下标题:“传输编码:分块”。基于@Salmans使用file\u get\u内容的思想,这是一个有效的解决方案。这使用POST发送数据(GET似乎不起作用,我认为必须自己将该查询字符串附加到URL):
闻起来有点像什么东西。那个JSON字符串是10236个八位字节长吗?您或输出流中的其他人是否调用了分块输出?可能没有关系,但为什么发送内容类型错误的JSON?JSON的内容类型是
application/JSON
,而不是text/plain
@Charles,我不是有意调用某些东西。如何调用分块输出?如果大小大于预定义的长度,它是否可以自动开始分块?我试图在GET请求中找到最大响应大小,但只能找到关于帖子大小的信息。。。发送前json_长度的大小为8400(这是多少个八位字节?)。我似乎是一个令人恼火的偶数…@Nicsoft,一个八位字节是8位,或一个字节。对不起,错了。如果使用,可能会得到分块传输编码。如果使用file\u get\u contents
读取文件,会得到什么?
$postdata = http_build_query(
array('customer_id' => $customer_id)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$content = file_get_contents($my_url, false, $context);
return $content;