2017-07-08 174 views
0

我正在做一個Curl請求從提供程序獲取JSON文件,並且返回的JSON文件很大。PHP Long Curl請求

如果我在瀏覽器中運行它,響應是一個21MB的字符串。當我用Curl運行這個請求時,它不僅花費很多時間,而且還以Fatal error: Allowed memory size of 268435456 bytes exhausted錯誤結束。

解決這個問題的一種方法是將ini_set('memory_limit', '512M');添加到我的代碼中(我已經用256代碼完成了它,但它仍然不夠...)。 我想知道是否有另一種方式來更快地獲取數據?

我知道這不是內存泄漏,它只是響應很大。 我不想增加內存限制,我知道它會工作,但我想知道是否有可能更快地獲取該數據,即使我必須將其保存到文件中以供後續讀取。

謝謝!

+0

有許多方法可以對JSON進行流式處理並因此節省內存,但是無法加快curl請求的速度。如果你可以的話,你應該在發送端實現某種分頁。 – colburton

+0

感謝您的回覆。 不幸的是我沒有任何控制提供商的服務器:( –

+0

你可以下載響應到一個文件,然後用[this](https://github.com/salsify/jsonstreamingparser) – GentlemanMax

回答

0

好吧,JSON是UTF-8,大多數UTF-8數據壓縮得非常好。

現在第一和最簡單的優化,是使捲曲的內置壓縮傳輸,通過做CURLOPT_ENCODING=>'',通過將其設定emptystring,你告訴捲曲提供該捲曲編譯時使用的所有壓縮編碼(通常包括gzipdeflate) - 特別是當gzip應用於jsons時,可以很容易地將其壓縮爲6-7倍,如果您的libcurl是使用gzip支持進行編譯的,那麼這應該是檢索json的巨大提速。目標服務器支持gzip壓縮trasnfer編碼。

現在,如果您想更加優化,下一步就是找出目標服務器支持的最強大的壓縮,並手動實施該壓縮。例如,可以說目標服務器支持的最強壓縮是LZMA2,格式爲xz。那麼你手動設置頁眉CURLOPT_HTTPHEADER=>array('Accept-Encoding: xz'),和捲曲已下載後,用https://github.com/payden/php-xz

  • XZ手動解壓,例如,而在大多數網絡服務器並不普遍支持,提供比gzip更好的壓縮和可以在一些測試

壓縮JSON的UTF-8到10倍,但它可能是不徵,你應該弄清楚目標服務器的最強支持的壓縮,不管它是什麼,並堅持下去。