在PHP中如何獲取使用者的真實IP

huidaoli發表於2013-07-29
/**
 * 獲得使用者的真實IP地址
 *
 * @access  public
 * @return  string
 */
function real_ip()
{
    static $realip = NULL;

    if ($realip !== NULL)
    {
        return $realip;
    }

    if (isset($_SERVER))
    {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

            /* 取X-Forwarded-For中第一個非unknown的有效IP字串 */
            foreach ($arr AS $ip)
            {
                $ip = trim($ip);

                if ($ip != 'unknown')
                {
                    $realip = $ip;

                    break;
                }
            }
        }
        elseif (isset($_SERVER['HTTP_CLIENT_IP']))
        {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        }
        else
        {
            if (isset($_SERVER['REMOTE_ADDR']))
            {
                $realip = $_SERVER['REMOTE_ADDR'];
            }
            else
            {
                $realip = '0.0.0.0';
            }
        }
    }
    else
    {
        if (getenv('HTTP_X_FORWARDED_FOR'))
        {
            $realip = getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (getenv('HTTP_CLIENT_IP'))
        {
            $realip = getenv('HTTP_CLIENT_IP');
        }
        else
        {
            $realip = getenv('REMOTE_ADDR');
        }
    }

    preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
    $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';

    return $realip;
}

如果大家還有別的方式的話,可以一起交流哦。

下面再給大家一些常用的PHP函式,以後說不定能用上哦。

  1 <?php
  2 class common {
  3  /*
  4 
  5      * 獲取伺服器的時區
  6 
  7      */
  8 
  9      function server_timezone(){
 10 
 11          if(function_exists('date_default_timezone_get')){
 12 
 13            return date_default_timezone_get();
 14 
 15          }else{
 16 
 17              return date('Z')/3600;
 18 
 19          }
 20 
 21      }
 22 
 23     /*
 24 
 25      * 獲取字串的長度
 26 
 27      */
 28 
 29     function str_len($str){
 30 
 31         $length = strlen(preg_replace('/[\x00-\x7F]/','',$str));
 32 
 33         if($length){
 34 
 35             return strlen($str)-$length + intval($length/3)*2;
 36 
 37         }else{
 38 
 39             return strlen($str);
 40 
 41         }
 42 
 43     }
 44 
 45     /*
 46 
 47      * 擷取字串
 48 
 49      * $str 將要擷取的字元換
 50 
 51      * $length 擷取字串的長度
 52 
 53      * $append 是否新增省落號 預設是
 54 
 55      */
 56 
 57     public function sub_str($str,$length=0,$append = true){
 58 
 59             $str = trim($str);
 60 
 61             $strlength = strlen($str);
 62 
 63             if($length == 0 || $length >= $strlength){
 64 
 65                  return $str;
 66 
 67             }elseif( $length < 0){
 68 
 69                  $length = $length + $strlength;
 70 
 71                  if($length < 0){
 72 
 73                      $length = $strlength;
 74 
 75                  }
 76 
 77             }
 78 
 79             if(function_exists("mb_substr")){
 80 
 81                 $newstr = mb_substr($str,0,$length,"gb2312");
 82 
 83             }elseif (function_exists('iconv_substr')){
 84 
 85                 $newstr = iconv_substr($str, 0, $length, "gb2312");
 86 
 87             }else
 88 
 89             {
 90 
 91                 $newstr = substr($str, 0, $length);
 92 
 93             }
 94 
 95             if ($append && $str != $newstr){
 96 
 97                 $newstr .= '...';
 98 
 99             }
100 
101             return $newstr;
102 
103     }
104 
105     /*獲得當前格林威治時間的時間戳
106 
107      * @return  integer
108 
109     */
110 
111     function getTime(){
112 
113         return (time() - date("Z"));
114 
115     }
116 
117     /*
118 
119      * 建立像這樣的查詢條件 in('','');
120 
121      */
122 
123     function db_create_in($itme_list,$feild_name){
124 
125         if(empty($itme_list)){
126 
127             return $feild_name."IN('')";
128 
129         }else{
130 
131             if(!is_array($feild_name)){
132 
133                 $itme_list = explode(",",$itme_list);
134 
135             }
136 
137             $itme_list = array_unique($itme_list);
138 
139             $itme_list_tmp ="";
140 
141             foreach($itme_list as $item){
142 
143                 if(!$item($item)){
144 
145                     $itme_list_tmp .= $itme_list_tmp?",'$item'":"'$item'";
146 
147                 }
148 
149             }
150 
151             if(empty($itme_list_tmp)){
152 
153                 return $feild_name."IN('')";
154 
155             }else{
156 
157                 return $feild_name."IN('.$itme_list_tmp.')";
158 
159             }
160 
161         }
162     }
163 
164     /*
165 
166      * 檢查時間的格式是否正確
167 
168      */
169 
170      function is_time($time){
171 
172          $pattern = '/[\d]{4}-[\d]{1,2}-[\d]{1,2}\s[\d]{1,2}:[\d]{1,2}:[\d]{1,2}/';
173 
174          return preg_match($pattern,$time);
175 
176      }
177 
178 }
179 
180 ?>
View Code

 

 

相關文章