2011-09-21 5 views
5

この問題は完全に失われています。非常に長いjson応答が停止し、HTTPヘッダーをテキストとして送信し続けます。

私はjson応答を取得するajaxクエリを持っています。ほとんどの状況でクエリはうまく動作しますが、jsonレスポンスが非常に大きいときには、つまずくようです。

問題は、応答の形式で終わるある:

...est":"test length"}]]} 
HTTP/1.1 200 OK 
Date: Wed, 21 Sep 2011 17:10:32 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html 

5b03d 
{"ResultsInfo":{"RequestID":"131661886010","FeedCompletion":{"0":"100"}},"ResultsData":[[{"test":"test length"},{"test":"test length"}, 

...0 

...表し同じ「{」テスト「:」テスト長さ「}のより、」ストリング

だからREPONSEフォームであると思われる:

  • で印刷データ
  • HTTPレスポンスヘッダの最後の部分
  • データ
  • のキャラクターの5b03d "
  • 最初の部分の文字「0」

これはしかし、それは360791文字で結構ですが、ないで起こることは、応答の正確な長さがありません372797文字で表示されます。

私はYiiのPHPフレームワークを使用していますが、そこでは広々とした検索がありませんでした。

ウェブサーバーが応答を複数の部分に分割しているか、タイムアウトしてから再開するようです。

おそらく最大リターンがありますか?

EDIT _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___

私はアプリケーション/ jsonコンテンツタイプを試してみましたが、それは起こっています。 TES次のように(applciaiton/JSONエンコーディングを使用した場合)体で返されるヘッダーのテキスト部分がある:私は、この特定のスクリプトのチャンクエンコーディングをオフにするにはどうすればよい

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 08:48:28 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=89 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: application/json 

** EDIT 2_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

チャンクとして、それはもはや送信されているようなので、それが見えない

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 11:55:39 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 372797 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Content-Type: application/json 

私は今、私が得る私のヘッダとレスポンスヘッダにコンテンツの長さを追加したが、まだのように体内にプリントアウトされます。しかし、同じ問題が存在します。レスポンスには内容が含まれており、ヘッダーが印刷されてから内容が増えます。

**唯一の違いは、応答に「5b03d」または「0」文字がないことです。

EDIT_3_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

を求めたようここに私のPHPコードの概要です

$dataArray = array(
    'ResultsData'=>array(
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      ... 
)); 

$return = json_encode($dataArray); 

header('Content-Length: '.strlen($return)); 
header('Content-type: application/json'); 

echo $return; 
+0

あなたのPHPコードはどのようなものですか?これは非常に珍しいことです。 –

答えて

2

は何をここで見ていると、転送チャンクエンコーディングされた - http://en.wikipedia.org/wiki/Chunked_transfer_encoding

これは、コンテンツタイプがtext/htmlのものとの組み合わせで問題が発生します。コンテンツタイプをapplication/jsonに設定すると問題が解決するはずです。

+0

こんにちは、私は上記の私の編集ごとに私のコンテンツタイプをapplication/jsonに変更しました。それはまだ起こっています(エンコーディングはまだチャンクされています) –

1

私はこの問題の答えを見つけられませんでしたが、問題は解決しました。

<?php 

// Make a large array of strings 
for($i=0;$i<10000;$i++) 
{   
    $arr[] = "testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem."; 
} 

// Create one large string from array 
$var = implode("-",$arr); 

// Set HTTP headers to ensure we are not 'chunking' response 
header('Content-Length: '.strlen($var)); 
header('Content-type: text/html'); 

// Print response 
echo $var; 

?> 

し、ブラウザでに行って、同じ問題を抱えて:私はこのコードを書いた標準のPHPファイルで

他にもこれを試してもらえますか?(今私は同じ結果を持つ2台のコンピュータを試しました)

2

私はjsonコードで応答するJavaサーバーを持っています。返されるjsonが大きくなると、テキストが破損します。ブラウザーごとに異なる破損が表示されますが、同じブラウザーで同じ場所で非常に頻繁に破損することがあります。

私のテストのうちの1つでは、9492バイトを送信します。最初の1495はOK、次の5204は欠落していましたが、Wiresharkの分析ではTCPストリームのバイトが示されていました。その後、次の1495バイトが安全に到着し、次の1298バイトは失われました。

これらの数値は一例です。他のブラウザは、同じ送信に対して異なる破損を表示します。同じブラウザでもほとんど同じ数字が繰り返されることがあります。たとえば、ほとんどの場合、Chromeの最初の破損が常に同じバイトにあります。

jsonの量は、4000バイトが常に成功したと言います。

この文脈でcontent-lengthを設定することによって、chunkinを停止する方法が見つかりませんでした。コードの信頼性についてのアイデアを伝えるだけです。同じJavaserverが、ブラウザを12年以上にわたってhtmlで提供しています。しかし、Jsonの応答は私がヘッダーを設定せずに出力ストリームによって送信されます。

自分のjavaプログラムから送信すると、ヘッダーはApacheサーバーによって作成されると思います。

0

チャンクされたJsonを送信するのに問題はありませんでした。しかし..

コンテンツの長さが不明なため、PHPがこれをクライアントにエコーしている間に、正しいコンテンツがチャンクされます。

  1. のob_start()...はob_end_flush()コンテンツを一度に送信され、コンテンツレンスヘッダが自動的に設定されることを保証します。

  2. 圧縮データは決してチャンクされません。したがって: ob_start(ob_gzhandler)... ob_end_flush()は有効です。

  3. クライアントスクリプト内のjsonをテストします。

  4. 「テスト」を繰り返すのに役に立たない。ネスティングには限界があります。

dataArray = array( 'ResultsData' => array(length0、length1、length2、...));

echo json_encode($ dataArray、JSON_NUMERIC_CHECK);

JSON_NUMERIC_CHECKは数字から引用符を取り除きます。

  1. ?5b03d?バイナリ文字列を送信しようとしますか?

  2. 私は373kbの内容の長さはメモリオーバーフローから遠いと思いますか?

関連する問題