2011-09-15 103 views
3

是否可以通過編程方式確定連接到遠程服務器時使用的IP地址cURL?我有一個共享服務器,我正在使用cURL,並且我需要發送IP地址作爲請求的一部分。cURL與PHP,可能確定cURL將使用的IP地址?

我正在與之通話的服務器需要結合連接IP地址和旋轉密碼的驗證字符串(例如,我的$ code = SHA1($ _ SERVER ['SERVER_ADDR']。$ passcode) SHA1($ _ SERVER ['REMOTE_ADDR']。$ passcode))。當cURL的傳出連接使用與$ _SERVER ['SERVER_ADDR']中存儲的IP相同的IP時,此功能正常工作,但cURL使用的IP地址現在不同並且定期輪換。

回答

3

你可以做到這一點,你打電話之前讓你的公網IP:

$ch = curl_init('http://whatismyip.org/'); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); 
$myIp = curl_exec($ch); 

但是:

  • 如果你的公網IP有時捲曲會話之間變化,有什麼可說的,它不會在上述會議和下一次會議之間進行更改,實際上您需要這些數據。
  • 它依賴於whatismyip.org(或類似的服務)實際上正在運行。
+0

+1,儘管我不會在沒有非常重要的警告的情況下給出它,但如果有一個池,則不能保證從一個呼叫到另一個呼叫的IP是相同的。未知單個呼叫中的多個cURL會話是否來自相同的IP甚至。 – Orbling

+0

現在,這是我正在使用的解決方案,但在我的一端提供了一項服務,而不是通過whatismyip來更快速地確定IP地址並且沒有訪問限制。不幸的是,每小時有3000個連接,這對我來說不是最有效的解決方案,所以我仍在尋找。 – Wige

2

您可以強制使用捲曲使用的IP,而不是檢測它。

curl_setopt()使用CURLOPT_INTERFACE選項 - 將其設置爲您希望使用的IP。

如果您正在使用帶有IP池的服務器(如雲服務器),那麼最好選擇要使用的接口,如果出於安全原因檢測另一端很重要。

就個人而言,當IP被限制時,我不得不使用該功能通過cURL進行卡支付數據傳輸。

+0

+1以獲得最佳解決方案,但可能無法共享主機。 – DaveRandom

+0

@DaveRandom:大多數共享主機平臺都至少有一個可以綁定的主服務器的主IP地址 - 雖然並不總是允許您修改。 – Orbling

+3

關於這點我剛剛想到的另一點是,如果他們有多個IP地址綁定到一個NIC,即使您傳遞特定的IP,選擇一個接口也不能保證一個特定的IP地址。 cURL只使用接口引用(如'eth0'),並且如果傳遞一個IP /主機名稱,它將使用它來獲取接口引用。實際上,爲數據包分配一個源IP是NIC驅動程序的責任,並且沒有任何事情可以控制它(至少不是通過PHP)。 – DaveRandom

1

有一個網站叫whatismyip.com。他們有一個公共可用的API,只要你沒有超過他們的限制(這就像每小時5個請求??)。不會傷害它,呃?

1

假設curl始終從同一臺服務器上運行,即使它有多個NIC,如果告訴curl使用哪個IP應該也無關緊要。

我會用獲得IP您目前正在使用什麼樣的DaveRandom的把戲,然後將其設置爲使用

curl_setopt($ch, CURLOPT_INTERFACE, "XXX.XXX.XXX.XXX"); 

假設兩個呼叫下一個電話足夠接近,有一個非常高的機會,IP會仍然會被綁定到一個接口上,並通過設置它告訴curl使用該接口,而不是負載均衡器可能要使用的那一個。