1、獲取服務器本地地址,最先想到的方法是根據$_SERVER['SERVER_ADDR']。
但在命令行運行程序時,獲取就獲取不到結果。
<?php var_dump($_SERVER['SERVER_ADDR']);
網頁訪問結果:string(14) "172.16.152.239"
命令行結果:
[root@lamp1 www]# php index.php
NULL
2、使用gethostbyname獲取
對於命令行來說,可以取到$_SERVER['HOSTNAME'],如果在/etc/hosts里設置了本機名稱對應的ip地址的話,則可以使用gethostbyname($_SERVER['HOSTNAME'])來獲取服務器IP地址,再結合$_SERVER['SERVER_ADDR']就得到通用的方法
<?php function get_server_ip(){ if(!empty($_SERVER['SERVER_ADDR'])) return $_SERVER['SERVER_ADDR']; return gethostbyname($_SERVER['HOSTNAME']); } var_dump(get_server_ip());
缺點也很明顯:就是如果機器沒有設置hosts的話gethostbyname就解析不出Ip地址,只能獲取本機名稱
3、使用系統命令
最原始也是最奏效的方法,使用底層信息ifconfig(ipconfig for windows)。使用shell_exec命令執行ifconfig,然后從字符串中解析出地址來
<?php function get_server_ip(){ if(!empty($_SERVER['SERVER_ADDR'])) return $_SERVER['SERVER_ADDR']; $result = shell_exec("/sbin/ifconfig"); if(preg_match_all("/addr:(\d+\.\d+\.\d+\.\d+)/", $result, $match) !== 0){ foreach($match[0] as $k=>$v){ if($match[1][$k] != "127.0.0.1") return $match[1][$k]; } } return false; }
當然還可對windows做平台適配,這里就不做了,因為實際互聯網公司的服務器中基本沒有采用windows做服務器的,何況是PHP做后台語言的呢。:)
結束語:其實對於一個服務器來說,可能存在多個網口,所以獲取服務器ip這個術語並不准確,它可以是一組ip,可能這也是為什么php沒有提供一個通用的獲取方法吧。