2012-12-13 83 views
11

我有一個腳本,它使用PHP中的curl_multi_ *函數運行1000個cURL請求。設置的cURL連接的最大數量是多少?

他們背後的瓶頸是什麼時候超時?

這是CPU使用率嗎?就服務器處理出站連接的數量而言,是否有一些更有效的方法來執行此操作?

我無法更改功能,而請求本身就是對遠程API的簡單調用。我只是想知道限制是什麼 - 我是否需要增加服務器或Apache連接或CPU的內存? (或其他我錯過的東西)

+0

打開文件限制在linux的盒子偷窺我認爲(運行'ulimit -a'作爲你正在使用的用戶,這是你的津貼)。除此之外,瓶頸可能會成爲網絡。我懷疑CPU會給一個該死的... – Wrikken

+0

你如何控制打開的文件限制? (我不太瞭解這個!) –

+1

[stackoverflow provides](http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken

回答

10

您的請求是在單個執行線程中完成的。瓶頸幾乎可以肯定是CPU,你有沒有看過curl multi code run? ...這是令人難以置信的cpu飢餓;因爲你沒有足夠的控制權來處理請求。 curl_multi使您可以一次編排1000個請求,但這並不是一個好主意。你幾乎沒有機會有效地使用curl_multi,因爲你不能夠很好地控制執行的流程,只需要服務套接字,select()就會佔用大量的CPU使用,你會看到你的代碼運行命令行。

在這樣的任務中CPU使用率高的原因是這樣的; PHP旨在運行幾分之一秒,儘可能快地完成所有事情。它通常無關緊要,因爲它的使用時間很短。當你延長這樣的任務時,問題變得更加明顯,每一個操作碼產生的開銷對程序員來說都是可見的。

我知道你說你不能改變執行,但仍然是一個完整的答案。這樣的任務更適合於Threading而不是Curl Multi,你應該開始閱讀​​,從http://php.net/Thread開始

在閒置的CPU上留在自己的設備上,您可以精確控制負責下載每個響應字節的代碼並上傳請求的每個字節,並且如果CPU使用率是一個問題,您可以通過顯式調用usleep或以有意義的方式限制連接使用來實現「nice」過程,另外你的請求可以在不同的線程中服務。

我不建議1000線程是要做的事情,它很可能不是。要做的事情是設計一個Stackable(參見文檔),其工作是以一種「高效」的方式創建和服務一個請求,以及設計池(參見github/pecl擴展資源的例子)來執行你的最新設計的請求...

+0

這是一個PHP問題,而不是一個捲曲的問題。 LibCurl可以擴展到10000個並行請求。這是造成問題的下一個重要因素。 – Lothar

相關問題