2010-02-26 222 views

回答

7

問題是,在CLI上運行PHP時,沒有涉及任何網絡活動,因此沒有IP地址。你需要首先定義的是,你想得到什麼 IP。

  • 運行腳本的客戶端的IP?
    不可能,因爲沒有「客戶端」。

  • 網絡接口的本地IP?
    運行一些系統實用程序,如ifconfig,但如果服務器具有多個網絡接口,則可能會獲得多個IP。

  • IP的a域,它可能對應於您正在運行的服務器?
    使用gethostbyname(),但你需要知道你想查詢哪個域。

  • 面向公衆所在的網絡/服務器的IP?
    你需要使用像www.whatsmyip.org這樣的外部服務(注意他們不喜歡這樣),它會告訴你你的請求來自哪個IP。這個地址是否對應於任何有用的東西是另一個話題。

底線是,如果你有興趣在$_SERVER['REMOTE_ADDR']$_SERVER['SERVER_ADDR'],它根本不適用於CLI運行腳本。

+0

他們(whatsmyip.org)不喜歡什麼?另外[ipinfo.io](http://ipinfo.io)值得一提。他們返回JSON響應。 – Taylan

3

此時,PHP不知道IP,除非你使用了pass_thru()或exec()這樣的shell工具,如ifconfig。我建議你爲此重新考慮使用CLI。

在這種情況下,將PHP CLI視爲「基本解釋器」。

0

我假設你在通過PHP處理連接時調用PHP CLI腳本。如果是這種情況,可以將$ _SERVER的值作爲命令行參數傳遞給CLI腳本。

1

因爲我在搜索它的時候發現了這個函數,所以我很快把它放在一起。可以使用更好的錯誤檢查等,但它可以完成這項工作。也許其他人會覺得它有用:

function get_external_ip() { 
    $ch = curl_init("http://icanhazip.com/"); 
    curl_setopt($ch, CURLOPT_HEADER, FALSE); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $result = curl_exec($ch); 
    curl_close($ch); 
    if ($result === FALSE) { 
     return "ERROR"; 
    } else { 
     return trim($result); 
    } 
} 
12

這一點代碼將獲得* nix系統上接口「eth0」的IP地址。

// get the local hosts ip address 
$hostsipaddress = str_replace("\n","",shell_exec("ifconfig eth0 | grep 'inet addr' | awk -F':' {'print $2'} | awk -F' ' {'print $1'}")); 
+0

有點破解,但確實有效。 – nickhar

+0

請記住,如果設備通過Wi-Fi連接,將會失敗。 http://stackoverflow.com/a/1814633/572660 –

+0

ifconfig | grep -m1'inet addr'| awk -F':'{'print $ 2'} | awk -F''{'print $ 1'} //我的IP地址不在eth0上 – zzapper

0

雖然vrillusions後是偉大的存在是爲了做有兩個原因(一)來源網頁可能無法始終保持剛纔的IP沒有但是這更好的方法(他們最近修改了指數有HTML)現在,雖然我們可以指向bot的/ s,但使用正則表達式匹配頁面上的ip並將其拉出會更容易。這是我設想的功能

function RemoteIP($source = 'http://canihazip.com'){ 
    $c = file_get_contents($source); 
    $ip = false; 
    if(preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $c, $m)){ 
     $ip = $m[1]; 
    } 
    return $ip; 
} 
print RemoteIP().PHP_EOL;