我一直在使用 PHP 调用 API 并以 JSON 格式检索一组数据。我需要一次进行 20 次批处理调用。因此,速度非常重要。
但是,我只需要第一个元素,实际上,我只需要一个数据,它就在 JSON 文件的开头,索引为 0。但是,JSON 文件返回大约 300 组数据。我必须等到所有数据都准备好才能继续。
我想通过消除冗余数据集来加速我的 API 调用。我是否可以只接收第一组数据而不必等到一切准备就绪然后再索引第一个元素?
原谅我的英语......提前谢谢你。
我一直在使用 PHP 调用 API 并以 JSON 格式检索一组数据。我需要一次进行 20 次批处理调用。因此,速度非常重要。
但是,我只需要第一个元素,实际上,我只需要一个数据,它就在 JSON 文件的开头,索引为 0。但是,JSON 文件返回大约 300 组数据。我必须等到所有数据都准备好才能继续。
我想通过消除冗余数据集来加速我的 API 调用。我是否可以只接收第一组数据而不必等到一切准备就绪然后再索引第一个元素?
原谅我的英语......提前谢谢你。
不。json 不是“可流式”格式。在您收到整个字符串之前,它不能被解码为原生结构。如果您知道您需要什么,那么您可以使用字符串操作来检索您需要的部分,但这既不可靠也不可取。同样,php 不会在文本被编码时将其流出。
例如,考虑您的数据结构是 LOOOONG 浅数组的情况
$x = array(
0 => blah
1 => blah
...
999,999,998 => blah
999,999,999 => array( .... even more nested data here ...)
);
流媒体格式会将其作为
['blah', 'blah' ............
您可以假设在顶层只有那些“废话”并输出 a ]
,以生成完整的 json 字符串:
['blah'.... , 'blah']
并发送它,然后你继续编码并到达那个子数组......现在你突然得到了
['blah' ....., 'blah'][ ...sub array here ....]
现在它不再是有效的 JSON。
所以基本上,json 编码是在一个(长)镜头中完成的,而不是在 dibs 和 drabs 中完成的,只是因为如果不先解析整个结构,你根本无法知道“稍后”会发生什么。
您可以使用 fopen 来获取保证其中包含所需内容的字节,然后使用正则表达式对其进行解析。就像是:
$max_bytes = 512;
$fp = fopen($url, "r") ;
$data = "" ;
if($fp) {
while(!preg_match('/"totalAmount"\:"(.*)"/U', $data, $match))
$data .= stream_get_contents($fp, $max_bytes) ;
fclose($fp);
if(count($match)){
$totalAmount = $match[1];
}
}
请记住,您不能将存储在 $data 中的字符串用作有效的 json。只会是部分的
不,您需要在解析并将所需数据发送回客户端计算机之前获取整个数据集。