關於PHP獲取服務器地址的方法


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沒有提供一個通用的獲取方法吧。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM