• 締切済み

json_encodeが表示しない

大量のデータを扱っているせいか echo json_encode($rs); でデータが表示しませんでした。 print_r($rs); ではちゃんとデータが表示されます。 データは多次元配列なのですが、 今回扱ったデータ量は、2000万文字くらいでした。 ちょっと重すぎますね。。。(桁数間違っていません。20,000,000文字) こういったデータを扱う旨い方法ってあるのでしょうか? 用途としては、jsからphpを呼び出してデータを作成(今回の2000万文字)して、jsで受け取って処理するという流れです。 phpだけで実行しても表示はされませんでした。 データを分けて受け取るしか無いんですかね・・・ 全てのデータを一旦、js側で配列に入れたいという事情があります。 そうすると、並べ替えとか、条件での検索等が容易にできる為です。 何かアドバイスあればよろしくお願いします。

みんなの回答

回答No.4

別の方が回答するけど、これは無理。 クライアント側の負荷も考えないといけないよ。 検索結果のみを表示する、ページングを考える、ソートも実行された時にSQL等で処理。 こうしないとサーバ、クライアントともに負荷が高すぎて、使い物にならない。 自分の処理の都合で容易にするよりも利用者側に立って開発するべき。

macus
質問者

お礼

お返事遅くなり、申し訳ありません。確かにそうですね!ありがとございます!

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

> エラー表示をONにしたら、 > Allowed memory size of 134217728 bytes exhausted (tried to allocate 10223601 bytes) > と出ていました。 > 134Mのデータでしたね。 いや、それ「(PHP のスクリプト実行に)割り当てられたメモリサイズ 134217728 バイトを使い果たしました(10223601 バイトを確保しようとしました)」という意味ですから。 ともあれ、php.ini を修正できないというのであれば、 # まあ、数万件のデータが数十万件になる恐れがあるから php.ini の修正ができたとしても焼け石に水なのですが。 あなたにとっては納得いかないでしょうが現状の > 全てのデータを一旦、js側で配列に入れたい という仕様について、何か別の方策を考えないといけないですね。 ……やっぱりサーバーにソート・絞り込み条件を投げて、サーバーの SQL で絞り込んだ結果を返すようにしませんか? 前の質問にあった > 毎回数千データを取ってくると凄く時間がかかります。 というのも一覧に表示する分だけサーバーから持ってくるようにすれば解決すると思うのですが。 有名どころの DBMS にはそのためのページング機能がありますし。 http://www.syboos.jp/database/doc/sql-query-paging.html

macus
質問者

お礼

再度ご回答ありがとうございます。 >……やっぱりサーバーにソート・絞り込み条件を投げて、サーバーの SQL で絞り込んだ結果を返すようにしませんか? はい。今回はこれが現実的な気がしてきました。。。 ありがとうございます。 もう少し別の方の回答がないか待ってみます。

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

#1 ですが、PHP でのメモリの扱いは無知だったため調べてみたところ、以下のページを見つけました。 http://mitsukuni.org/blog/2009/01/16/php%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E5%89%B2%E5%BD%93%E9%87%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/ 上記を踏まえての追加の補足要求です。 (4) php.ini の memory_limit の設定はどうなっていますか? また、php.ini を書き換えることはできますか?

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

ああ、最後に書いてある事情がどこかで聞いたような話だと思ったら、この質問の方でしたか。 http://okwave.jp/qa/q8731703.html 自分の立場はこの時の回答のままですがそれは置いといて、以下の点の補足をお願いいたします。 (1) $rs って何ですか? > echo json_encode($rs); の一行だけ抜き出されても何とも言えません。公開できる範囲でのソースコードを呈示願います。 (2) 「データが表示しませんでした」とのことですが、それは想定した2000万文字のデータが表示されないという事でしょうか、それとも表示そのものが無いという事でしょうか。 (3) json_encode() の直後に json_last_error() を実行してみてください。その値はどうなりましたか? http://php.net/manual/ja/function.json-last-error.php

macus
質問者

お礼

ご回答ありがとうございます! はい。以前の質問のときに使った方法で並べ替えも使いたいです。 追記: エラー表示をONにしたら、 Allowed memory size of 134217728 bytes exhausted (tried to allocate 10223601 bytes) と出ていました。 134Mのデータでしたね。 (1)に関して $rsは、データベースに入っているデータを取ってきています。 $rs[n][title] = "hogehogehoge" $rs[n][discription] = "hogehogehoge" $rs[n][contents] = "hogehogehoge" $rs[n][value] = 500 .... で、nが状況によって違うのですが、数万データあります。 (2)表示そのものをしなかったです。print_rならすべて表示されました。 (3)echo json_last_error();を、echo json_encode($rs);の後に書きましたが、何も表示されませんでした。 (4)同じ階層に、php.iniを入れてmemory_limit = -1としましたが、だめでした。 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 10223601 bytes) php.iniはよくわからないです・・・

すると、全ての回答が全文表示されます。

関連するQ&A