1

PHP を使用して API を呼び出し、JSON で一連のデータを取得しています。一度に 20 個のバッチ呼び出しを行う必要があります。したがって、速度は非常に重要です。

ただし、必要なのは最初の要素だけです。実際には、JSON ファイルの先頭にあるインデックス 0 の 1 つのデータのみが必要です。ただし、JSON ファイルは約 300 セットのデータを返します。先に進む前に、すべてのデータの準備が整うまで待たなければなりません。

冗長なデータセットを排除して、API 呼び出しを高速化したいと考えています。すべての準備が整うまで待たずに、データの最初のセットのみを受け取り、最初の要素のインデックスを作成することは可能ですか?

英語で失礼します...よろしくお願いします。

4

3 に答える 3

1

番号。json は「ストリーミング可能な」形式ではありません。文字列全体を受け取るまでは、ネイティブ構造にデコードできません。必要なものがわかっている場合は、文字列操作を使用して必要な部分を取得できますが、それは信頼できず、お勧めできません。同様に、php はテキストがエンコードされているため、テキストをストリーミングしません。

たとえば、データ構造がLOOOONGの浅い配列である場合を考えてみましょう

$x = array(
    0 => blah
    1 => blah
    ...
    999,999,998 => blah
    999,999,999 => array( .... even more nested data here ...)
);

ストリーミング形式は、これを次のようにドリブルします。

['blah', 'blah' ............

最上位に「何とか」しかないと仮定し]て、完全な json 文字列を生成するために aを出力できます。

['blah'....   , 'blah']

それを送信しますが、エンコードを続行してそのサブ配列に到達します...今、突然取得しました

['blah' ....., 'blah'][ ...sub array here ....]

これはもはや有効な JSON ではありません。

したがって、基本的に、json エンコーディングは 1 回の (長い) ショットで行われ、ディブやドラブではありません。最初に構造全体を解析しないと、「後で」何が来るかを単純に知ることができないからです。

于 2013-03-04T20:43:33.273 に答える
1

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 として使用できないことに注意してください。一部のみになります

于 2013-03-04T20:47:09.153 に答える
0

いいえ。必要なデータを解析してクライアント マシンに送り返す前に、セット全体をフェッチする必要があります。

于 2013-03-04T20:46:01.713 に答える