標題幾乎總結了它:如何從CLI獲取使用PHP的服務器IP地址?
我怎樣才能從CLI使用PHP獲得服務器的IP地址?
使用PHP的CLI,$ _SERVER不包含服務器的IP地址,所以明顯的解決方案是不可能的。
謝謝!
標題幾乎總結了它:如何從CLI獲取使用PHP的服務器IP地址?
我怎樣才能從CLI使用PHP獲得服務器的IP地址?
使用PHP的CLI,$ _SERVER不包含服務器的IP地址,所以明顯的解決方案是不可能的。
謝謝!
問題是,在CLI上運行PHP時,沒有涉及任何網絡活動,因此沒有IP地址。你需要首先定義的是,你想得到什麼 IP。
運行腳本的客戶端的IP?
不可能,因爲沒有「客戶端」。
網絡接口的本地IP?
運行一些系統實用程序,如ifconfig
,但如果服務器具有多個網絡接口,則可能會獲得多個IP。
IP的a域,它可能對應於您正在運行的服務器?
使用gethostbyname()
,但你需要知道你想查詢哪個域。
面向公衆所在的網絡/服務器的IP?
你需要使用像www.whatsmyip.org這樣的外部服務(注意他們不喜歡這樣),它會告訴你你的請求來自哪個IP。這個地址是否對應於任何有用的東西是另一個話題。
底線是,如果你有興趣在$_SERVER['REMOTE_ADDR']
或$_SERVER['SERVER_ADDR']
,它根本不適用於CLI運行腳本。
此時,PHP不知道IP,除非你使用了pass_thru()或exec()這樣的shell工具,如ifconfig。我建議你爲此重新考慮使用CLI。
在這種情況下,將PHP CLI視爲「基本解釋器」。
我假設你在通過PHP處理連接時調用PHP CLI腳本。如果是這種情況,可以將$ _SERVER的值作爲命令行參數傳遞給CLI腳本。
因爲我在搜索它的時候發現了這個函數,所以我很快把它放在一起。可以使用更好的錯誤檢查等,但它可以完成這項工作。也許其他人會覺得它有用:
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);
}
}
這一點代碼將獲得* 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'}"));
雖然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;
他們(whatsmyip.org)不喜歡什麼?另外[ipinfo.io](http://ipinfo.io)值得一提。他們返回JSON響應。 – Taylan