2017-07-08 14 views
0

私は、プロバイダからJSONファイルを取得するためにCurlリクエストを行い、返されるJSONファイルは膨大です。PHP Long Curlリクエスト

ブラウザで実行すると、応答は21Mb文字列になります。 Curlでこのリクエストを実行しているときは、時間がかかるだけでなく、Fatal error: Allowed memory size of 268435456 bytes exhaustedというエラーで終了します。

解決方法の1つは、私のコードにini_set('memory_limit', '512M');を追加することです(私は既に256で行っていますが、まだ十分ではありません...)。 データを高速に取得する別の方法があるのだろうか?

私はそれがメモリリークではないことを知っています、それは応答が巨大であることです。 メモリの容量を増やしたくないのですが、動作することはわかっていますが、後で読むためにファイルに保存しなくても、データを高速に取得できるかどうかを知りたいと思います。

ありがとうございます!

+0

JSONをストリーミングしてメモリを節約する方法はありますが、カールの要求をスピードアップすることはできません。あなたができる場合は、送信側でページ作成のいくつかの並べ替えを実装する必要があります。 – colburton

+0

お返事ありがとうございます。 残念ながら私はプロバイダのサーバを制御できません:( –

+0

レスポンスをファイルにダウンロードし、[this](https://github.com/salsify/jsonstreamingparser)のようなものでファイルを解析すると、 – GentlemanMax

答えて

0

よく、JSONはUTF-8であり、ほとんどのUTF-8データは非常によく圧縮されます。今

最初と最も簡単な最適化は、カールの内蔵圧縮転送、emptystringするためにそれを設定することにより、CURLOPT_ENCODING=>''を行うことによって、あなたはカールがコンパイルされたすべての圧縮符号化を提供するカール伝える有効にすることです(通常gzipを含みますとdeflate) - 特にgzipをjsonsに適用すると、jsonを簡単に圧縮することができます。これは、libcurlがgzipサポートでコンパイルされていれば、jsonを検索する際のスピードアップになります。ターゲットサーバはgzip圧縮trasnferエンコーディングをサポートしています。

さらに最適化する場合、次のステップは、ターゲットサーバーでサポートされている最も強い圧縮が何であるか把握し、その圧縮を手動で実装することです。たとえば、ターゲットサーバーでサポートされている最も強い圧縮がxz形式のLZMA2であるとします。その後、手動でヘッダーCURLOPT_HTTPHEADER=>array('Accept-Encoding: xz')を設定したい、とカールした後、それをダウンロードした、https://github.com/payden/php-xz

  • XZで、たとえば、それを手動で解凍し、一般的にほとんどのWebサーバでサポートされていない一方で、gzip形式よりも優れた圧縮を提供し、いくつかのテストでJSONのutf-8を10倍に圧縮することができます。

おそらくxzではないため、サポートされている最も強いサポートされている圧縮を把握してください。

関連する問題