Php 我使用哪种方法获取每台计算机的ip地址

Php 我使用哪种方法获取每台计算机的ip地址,php,mysql,sql-server,ip,Php,Mysql,Sql Server,Ip,我们办公室里有50多台电脑,每台电脑都与当地服务提供商有单独的互联网连接。现在在我们的网站上,我们希望获得每台计算机的信息,我不知道没有ip,在用户注册时还有其他方法 因此,作为一种普通方法,我们使用$ip=$\u SERVER['SERVER\u ADDR'];但它显示所有计算机/连接的相同ip 在这里,我找到了许多解决方案来获得一个真正的ip。但我感到困惑的是,在我们网站的注册过程中,什么对我们获得每台计算机的ip更好 方法1: getenv() is used to get the val

我们办公室里有50多台电脑,每台电脑都与当地服务提供商有单独的互联网连接。现在在我们的网站上,我们希望获得每台计算机的信息,我不知道没有ip,在用户注册时还有其他方法

因此,作为一种普通方法,我们使用$ip=$\u SERVER['SERVER\u ADDR'];但它显示所有计算机/连接的相同ip

在这里,我找到了许多解决方案来获得一个真正的ip。但我感到困惑的是,在我们网站的注册过程中,什么对我们获得每台计算机的ip更好

方法1:

getenv() is used to get the value of an environment variable in PHP.

// Function to get the client IP address
function get_client_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
    $ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
    $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
    $ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
    $ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
   $ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
    $ipaddress = getenv('REMOTE_ADDR');
else
    $ipaddress = 'UNKNOWN';
return $ipaddress;
}

$_SERVER is an array that contains server variables created by the web server.

// Function to get the client IP address
function get_client_ip() {
$ipaddress = '';
if ($_SERVER['HTTP_CLIENT_IP'])
    $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
    $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED'])
    $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR'])
    $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED'])
    $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['REMOTE_ADDR'])
    $ipaddress = $_SERVER['REMOTE_ADDR'];
else
    $ipaddress = 'UNKNOWN';
return $ipaddress;
}
方法2:

$host= gethostname();
$ip = gethostbyname($host);
方法3:

$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');
方法4:最先进的方法

function get_ip_address() {
// check for shared internet/ISP IP
if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
    return $_SERVER['HTTP_CLIENT_IP'];
}

// check for IPs passing through proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    // check if multiple ips exist in var
    if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
        $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        foreach ($iplist as $ip) {
            if (validate_ip($ip))
                return $ip;
        }
    } else {
        if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
}
if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
    return $_SERVER['HTTP_X_FORWARDED'];
if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
    return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
    return $_SERVER['HTTP_FORWARDED_FOR'];
if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
    return $_SERVER['HTTP_FORWARDED'];

// return unreliable ip since all else failed
return $_SERVER['REMOTE_ADDR'];
}

/**
 * Ensures an ip address is both a valid IP and does not fall within
 * a private network range.
 */
function validate_ip($ip) {
if (strtolower($ip) === 'unknown')
    return false;

// generate ipv4 network address
$ip = ip2long($ip);

// if the ip is set and not equivalent to 255.255.255.255
if ($ip !== false && $ip !== -1) {
    // make sure to get unsigned long representation of ip
    // due to discrepancies between 32 and 64 bit OSes and
    // signed numbers (ints default to signed in PHP)
    $ip = sprintf('%u', $ip);
    // do private network range checking
    if ($ip >= 0 && $ip <= 50331647) return false;
    if ($ip >= 167772160 && $ip <= 184549375) return false;
    if ($ip >= 2130706432 && $ip <= 2147483647) return false;
    if ($ip >= 2851995648 && $ip <= 2852061183) return false;
    if ($ip >= 2886729728 && $ip <= 2887778303) return false;
    if ($ip >;= 3221225984 && $ip <= 3221226239) return false;
    if ($ip >;= 3232235520 && $ip <= 3232301055) return false;
    if ($ip >= 4294967040) return false;
}
return true;
}

方法1-3几乎做了完全相同的事情。getenv和$\u服务器与前面提到的几乎相同

方法4更高级一些,它在返回ip地址之前检查并验证有效ip地址。我认为这是最好的,因为它消除了错误代理返回的坏ip地址,如果您希望得到一个ip地址并得到完全不同的结果,那么这些错误代理可能会在以后破坏代码


我的建议是:使用phpinfo;在其中一台机器上,查看您想要获取哪些变量。这些脚本只不过是在已知的可选http头中循环查找ip地址,比如它们是否在代理后面。您可以从远程地址获取代理的ip地址,但代理说,嘿,我像代理一样行事,这就是与我连接的人:HTTP\u FORWARDED\u FOR。

通过sql server,您可以从下面的查询获取ip地址

SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS') [Machine Name]
   ,SERVERPROPERTY('InstanceName') AS [Instance Name]
   ,LOCAL_NET_ADDRESS AS [IP Address Of SQL Server]
   ,CLIENT_NET_ADDRESS AS [IP Address Of Client]
 FROM SYS.DM_EXEC_CONNECTIONS 

您还可以使用远程主机名而不是ip地址,并且可以通过使用gethostname轻松获取主机名;功能。谢谢你,先生,我想知道这件事。这听起来不像是他们每台计算机都与本地服务提供商有单独的互联网连接。相反,他们共享一个