2010-04-19 88 views
6

我在使用fgets獲取服務器對某些批量數據庫調用的響應時產生了一些實際問題。PHP讀取服務器響應的最快方法

我正在通過一批說,10,000個電話發送,我跟蹤滯後到fgets導致滯留在我的應用程序的速度,因爲每個電話的響應需要抓住。

我發現這個線程http://bugs.php.net/bug.php?id=32806這也解釋了這個問題非常好,但他閱讀文件,而不是一個服務器響應所以fread可能有點棘手,因爲我能得到下一行的一部分,多餘的東西,我不要不想要。

所以我的問題是,什麼是最好的/最快的方式來讀取服務器的響應作爲替代fgets?

+0

你問什麼? PHP語言不像速度處理沒有任何東西,但這種語言是不適合的。 – Svisstack 2010-04-19 20:51:15

+0

你能展示一些代碼嗎?這些是什麼樣的數據庫調用? – 2010-04-19 20:52:44

+0

他們是對Redis NoSQL服務器的調用 – 2010-04-19 21:11:28

回答

0

這裏沒有足夠的信息。

大概你的意思是你正在運行某個PHP的某個地方,它調用fgets從其他地方讀取數據 - 但是其他的東西是什麼?你暗示它不是一個文件 - 那它是什麼?本地程序?管道?一個網絡套接字?一個網頁? ...別的東西?

你可以使用不同的工具更快地讀取它嗎?你有什麼嘗試?你在運行什麼操作系統?你有shell訪問來運行netcat或類似的?

另外你說的是滯後,而你所說的「bug」主要是針對帶寬。

不知道更多關於這個問題,不可能提出解決方案。

C.

+0

當然,好點 - 即時通訊使用PHP框架(Predis)與Redis數據庫進行交互。似乎當我通過從PHP到Redis的套接字連接發送一批命令時,用於讀取Redis服務器響應的fgets導致延遲。 基本上,Predis框架使用fgets來讀取服務器的響應,這就是所有時間都花費在通過線路發送和接收數據的地方。 – 2010-04-19 21:49:28

+0

所以下一個問題是你怎麼知道問題出在PHP端?你有沒有用另一個客戶端進行測試?你有沒有嘗試運行套接字作爲非阻塞? – symcbean 2010-04-20 11:35:05

+0

你確定延遲是在PHP中,而不是在數據庫端。 – 2010-04-27 18:03:03

2

的file_get_contents(或stream_get_contents如果你有一個流)應該是讀取服務器的響應最快的方法。那麼,它是檢索數據的最快方式,但是在查看內存使用情況時,它通常是最浪費的方式,因爲它一次將所有文件讀入內存,而fgets不需要在內存中保留多行。

您還使用fread,它比fgets更快,並以您可以定義的特定大小的塊讀取文件。

如果您依賴於逐行讀取數據,則可以使用file()將比file_get_contents慢的文件,但它會爲您提供一個包含文件行的數組。

爲了給你一個更好的答案,如上所述,我們需要更多的信息。