3

開発中のアプリケーションが壊れていることに気付きました。この問題に絞り込むことができました (テスト ケースを設定しました)。

ini_set("display_errors", "1");
error_reporting(E_ALL);

error_log("[test] Memory limit: " . ini_get('memory_limit'));
error_log("[test] Max Execution Time: " . ini_get('max_execution_time'));

$testArray = array("abcdefghijklmnotuv..... 786998 characters later...ijklmEND");
$json = json_encode($testArray);

var_dump($json);
// echo($json);

error_log("[test] Memory: ".memory_get_usage()."B");

変数 $json を var_dump すると、正しい出力が得られます。

string(786998) "["abcdefghijklm....ijklmEND"]"

変数 $json をエコーすると、画面に何かが表示されるのを非常に簡単に確認できますが、その後消えます。最終応答は NULL のようです。

上記を配列の代わりに文字列で繰り返すと、同じことが起こります。

上記を文字列で繰り返し、json_encode ステップを省略した場合、すべてが期待どおりに動作し、var_dump と echo の結果は正しいです。

プロセス全体で、エラー ログにエラーが出力されません。メモリ制限と最大実行時間も問題ありません。

[test] Memory limit: 256M
[test] Max Execution Time: 30
[test] Memory: 2134296B

何か案は?

私のアプリケーションに関するちょっとした情報:

一言で言えば、2つのサーバーがあります。サーバー A は HTTP 要求をサーバー B に送信し、サーバー B は要求を処理して応答をサーバー A に返します。応答は常に JSON でエンコードされた配列です。応答の配列の値の 1 つが長すぎる場合、サーバー A は NULL 応答を受け取ります。

4

1 に答える 1

1

問題はサーバー B ではなく、サーバー A であることがわかりました。

サーバー A は、Netty API を使用して Java で実装されています。

HTTP 応答が長すぎて、チャンクされていて、パイプラインに HttpChunkAggregator がありませんでした。一度追加すると、すべて問題ありませんでした。

ClientBootstrap cb = new ClientBootstrap(cf);

cb.getPipeline().addLast("codec", new HttpClientCodec());
cb.getPipeline().addLast("chunkaggregator", new HttpChunkAggregator(1048576));
cb.getPipeline().addLast("inflater", new HttpContentDecompressor());
cb.getPipeline().addLast("handler", new OutboundHandler());

ブラウザのソースを外部で確認したところ、コードがそこにありました。コメントをありがとう、彼らは私を正しい方向に導いてくれました!

于 2013-04-09T02:52:56.817 に答える