Перейти к контенту

Онлайн список со странами


Рекомендуемые сообщения

Это лично мой взгляд на фичу списка со странами. Мод малость тормозной, однако работает и не требует никаких баз данных - в нем уже вшит список двухбуквенных кодов стран.

Получение кода страны из IP адреса делается путем выдергивания соответствующей строчки из WHOIS запроса. Говорят можно на свой сервер установить какую-то приблуду для таких запросов, но я в этом плохо разбираюсь, поэтому использую удаленный сервер.

Главная проблема заключается в том, чтобы получить именно то, что нужно. Представленный мод достаточно универсализирован под разные whois-сервисы - у каждого есть свои особенности (где-то вставляют   зачем-то, а где-то искомая строчка начинается с заглавной буквы).

Для дополнительной универсализации потребовалась функция регистро-независимой замены - ее нет в PHP младше 5, поэтому я вышла из положения добавив ее аналог, потыренный на php.net для PHP версии 4.

 

Хватит разговоров короче.... вот. Жду предложений.

 

В sources/classes/ кладем файл whois.php следующего вида:

<?

// mixed str_ireplace ( mixed search, mixed replace, mixed subject, int &count] )
// Case-insensitive version of str_replace.
//    If someone knows how to pass the $count paramater as a reference without
//    requiring it, please let me know. I tried func_get_arg() already. Lines
//    to do with $count have been commented out by "// >>"
if ( !function_exists('str_ireplace') )
{
  function str_ireplace ($search, $replace, $subject) // >> , &$count)
  {
      //Loop back until done if using a subject array
      if ( is_array($subject) )
      {
          $array_keys = array_keys($subject);
          while ( true )
          {
              // This is done here rather than in the while() statement because 0 evaluates as false
              $key = array_pop($array_keys);
              
              // If $key is null then there are no more subjects
              if ( $key === NULL)
              {
                  return $subject;
              }
          
              $subject[$key] = str_ireplace($search, $replace, $subject[$key]); // >> , $count);
          }
          return $subject;
      }
  
      // Loop back until done if using a search array        
      if ( is_array($search) )
      {
          //Only need to check this once
          $is_array = is_array($replace);
          
          while ( true )
          {
              $needle = array_pop($search);
              
              // If needle is null then there are no more searches to process
              if ( $needle === NULL )
              {
                  return $subject;
              }
              
              // If no needle, don't even bother
              // In PHP, empty(0) returns true, so the second check is needed
              if ( empty($needle) && (string)$needle !== "0" )
              {
                  continue;
              }
              
              if ( $is_array == true )
              {
                  // If no replacements are left, use empty string instead
                  if ( count($replace) )
                  {
                      $replacement = array_pop($replace);
                  }
                  else
                  {
                      $replacement = '';
                  }
              }
              else
              {
                  // If replacement is not an array, use the same value each time
                  $replacement = $replace;
              }
              
              $subject = str_ireplace($needle, $replacement, $subject); // >> , $count);
          }
          return $subject;
      }
  
      // Now begins the meat of the function
      // Define some variables - compiler throws 'E_NOTICE undefined variable' if you don't
      $newsubject = '';
      $end = '';
      $offset = 0;
  
      // Only need to do this once
      $lowerneedle = strtolower($search);
      $lowersubject = strtolower($subject);
  
      // Keep going until I say so
      while ( true )
      {
          // $pos will either be the position of the needle (can be 0) or FALSE
          $pos = strpos($lowersubject, $lowerneedle, $offset);
          // Operator === also checks against types, 0 == FALSE, 0 !== FALSE
          if ($pos === false)
          {
              // Tack on the rest
              $end = substr($subject, $offset);
              $newsubject .= $end;
              return $newsubject;
          }
          
          // Get the data before the needle
          $front = substr($subject, $offset, $pos);
          // Append the next piece and the replacement
          $newsubject .= $front . $replace;
          // Set offset to search beyond needle next time
          // This is important because the replacement may contain the needle
          $offset = $pos + strlen($search);
          // Pretty self explanatory
          // >> $count++;
      }
  
      // This should never happen, but it's here in case
      return $subject;
  }
}



class class_country_ip
{
var $country = array(
'AC' => 'Ascension Island (остров Вознесения)',
'AD' => 'Andorra (Андорра)',
'AE' => 'United Arab Emirates (Объединенные Арабские Эмираты)',
'AF' => 'Afghanistan (Афганистан)',
'AG' => 'Antigua and Barbuda (Антигуа и Барбуда)',
'AI' => 'Anguilla',
'AL' => 'Albania (Албания)',
'AM' => 'Armenia (Армения)',
'AN' => 'Netherlands Antilles (Голланские Антильские острова)',
'AO' => 'Angola (Ангола)',
'AQ' => 'Antarctica (Антарктика)',
'AR' => 'Argentina (Аргентина)',
'AS' => 'American Samoa (Американское Самоа)',
'AT' => 'Austria (Австрия)',
'AU' => 'Australia (Австралия)',
'AW' => 'Aruba (Аруба)',
'AX' => 'Aland Islands (Аландские острова)',
'AZ' => 'Azerbaijan (Азербайджан)',
'BA' => 'Bosnia and Herzegovina (Босния и Герцеговина)',
'BB' => 'Barbados (Барбадос)',
'BD' => 'Bangladesh (Бангладеш)',
'BE' => 'Belgium (Бельгия)',
'BF' => 'Burkina Faso (Буркина-Фасо)',
'BG' => 'Bulgaria (Болгария)',
'BH' => 'Bahrain (Бахрейн)',
'BI' => 'Burundi (Бурунди)',
'BJ' => 'Benin (Бенин)',
'BM' => 'Bermuda (Бермудские острова)',
'BN' => 'Brunei Darussalam (Бруней)',
'BO' => 'Bolivia (Боливия)',
'BR' => 'Brazil (Бразилия)',
'BS' => 'Bahamas (Багамские острова)',
'BT' => 'Bhutan (Бутан)',
'BV' => 'Bouvet Island',
'BW' => 'Botswana (Ботсвана)',
'BY' => 'Belarus (Беларусь)',
'BZ' => 'Belize (Белиз)',
'CA' => 'Canada (Канада)',
'CC' => 'Cocos (Keeling) Islands (Кокосовые острова)',
'CD' => 'Congo (Конго)',
'CF' => 'Central African Republic (Центральноафриканская Республика)',
'CG' => 'Congo (Конго)',
'CH' => 'Switzerland (Швейцария)',
'CI' => 'Cote d`Ivoire (Кот-д`Ивуар)',
'CK' => 'Cook Islands (острова Кука)',
'CL' => 'Chile (Чили)',
'CM' => 'Cameroon (Камерун)',
'CN' => 'China (Китай)',
'CO' => 'Colombia (Колумбия)',
'CR' => 'Costa Rica (Коста-Рика)',
'CS' => 'Serbia and Montenegro (Сербия и Черногория)',
'CU' => 'Cuba (Куба)',
'CV' => 'Cape Verde (Кабо-Верде)',
'CX' => 'Christmas Island (остров Рождества)',
'CY' => 'Cyprus (Кипр)',
'CZ' => 'Czech Republic (Чехия)',
'DE' => 'Germany (Германия)',
'DJ' => 'Djibouti (Джибути)',
'DK' => 'Denmark (Дания)',
'DM' => 'Dominica (Доминика)',
'DO' => 'Dominican Republic (Доминиканская Республика)',
'DZ' => 'Algeria (Алжир)',
'EC' => 'Ecuador (Эквадор)',
'EE' => 'Estonia (Эстония)',
'EG' => 'Egypt (Египет)',
'EH' => 'Western Sahara (Западная Сахара)',
'ER' => 'Eritrea (Эритрея)',
'ES' => 'Spain (Испания)',
'ET' => 'Ethiopia (Эфиопия)',
'FI' => 'Finland (Финляндия)',
'FJ' => 'Fiji (Фиджи)',
'FK' => 'Falkland Islands (Фолклендские острова)',
'FM' => 'Micronesia (Микронезия)',
'FO' => 'Faroe Islands (Фарерские острова)',
'FR' => 'France (Франция)',
'GA' => 'Gabon (Габон)',
'GB' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)',
'GD' => 'Grenada (Гренада)',
'GE' => 'Georgia (Грузия)',
'GF' => 'French Guiana (Французская Гвиана)',
'GG' => 'Guernsey (остров Гернси)',
'GH' => 'Ghana (Гана)',
'GI' => 'Gibraltar (Гибралтар)',
'GL' => 'Greenland (Гренландия)',
'GM' => 'Gambia (Гамбия)',
'GN' => 'Guinea (Гвинея)',
'GP' => 'Guadeloupe (Гваделупа)',
'GQ' => 'Equatorial Guinea (Экваториальная Гвинея)',
'GR' => 'Greece (Греция)',
'GS' => 'South Georgia and the South Sandwich Islands (Южная Джорджия и Южные Сандвичевы острова)',
'GT' => 'Guatemala (Гватемала)',
'GU' => 'Guam (Гуам)',
'GW' => 'Guinea-Bissau (Гвинея-Бисау)',
'GY' => 'Guyana (Гайана)',
'HK' => 'Hong Kong (Гонконг)',
'HM' => 'Heard and McDonald Islands',
'HN' => 'Honduras (Гондурас)',
'HR' => 'Croatia/Hrvatska (Хорватия)',
'HT' => 'Haiti (Гаити)',
'HU' => 'Hungary (Венгрия)',
'ID' => 'Indonesia (Индонезия)',
'IE' => 'Ireland (Ирландия)',
'IL' => 'Israel (Израиль)',
'IM' => 'Isle of Man (остров Мэн)',
'IN' => 'India (Индия)',
'IO' => 'British Indian Ocean Territory',
'IQ' => 'Iraq (Ирак)',
'IR' => 'Iran (Иран)',
'IS' => 'Iceland (Исландия)',
'IT' => 'Italy (Италия)',
'JE' => 'Jersey (остров Джерси)',
'JM' => 'Jamaica (Ямайка)',
'JO' => 'Jordan (Иордания)',
'JP' => 'Japan (Япония)',
'KE' => 'Kenya (Кения)',
'KG' => 'Kyrgyzstan (Кыргызстан)',
'KH' => 'Cambodia (Камбоджа)',
'KI' => 'Kiribati (Кирибати)',
'KM' => 'Comoros (Коморские острова)',
'KN' => 'Saint Kitts and Nevis (Сент-Китс и Невис)',
'KP' => 'Korea (Северная Корея)',
'KR' => 'Korea (Южная Корея)',
'KW' => 'Kuwait (Кувейт)',
'KY' => 'Cayman Islands (Каймановы острова)',
'KZ' => 'Kazakhstan (Казахстан)',
'LA' => 'Lao (Лаос)',
'LB' => 'Lebanon (Ливан)',
'LC' => 'Saint Lucia (Сент-Люсия)',
'LI' => 'Liechtenstein (Лихтенштейн)',
'LK' => 'Sri Lanka (Шри-Ланка)',
'LR' => 'Liberia (Либерия)',
'LS' => 'Lesotho (Лесото)',
'LT' => 'Lithuania (Литва)',
'LU' => 'Luxembourg (Люксембург)',
'LV' => 'Latvia (Латвия)',
'LY' => 'Libya (Ливия)',
'MA' => 'Morocco (Марокко)',
'MC' => 'Monaco (Монако)',
'MD' => 'Moldova (Молдова)',
'MG' => 'Madagascar (Мадагаскар)',
'MH' => 'Marshall Islands (Маршалловы острова)',
'MK' => 'Macedonia (Македония)',
'ML' => 'Mali (Мали)',
'MM' => 'Myanmar (Мьянма)',
'MN' => 'Mongolia (Монголия)',
'MO' => 'Macau (Макао)',
'MP' => 'Northern Mariana Islands (Северные Марианские острова)',
'MQ' => 'Martinique (Мартиника)',
'MR' => 'Mauritania (Мавритания)',
'MS' => 'Montserrat (Монтсеррат)',
'MT' => 'Malta (Мальта)',
'MU' => 'Mauritius (Маврикий)',
'MV' => 'Maldives (Мальдивы)',
'MW' => 'Malawi (Малави)',
'MX' => 'Mexico (Мексика)',
'MY' => 'Malaysia (Малайзия)',
'MZ' => 'Mozambique (Мозамбик)',
'NA' => 'Namibia (Намибия)',
'NC' => 'New Caledonia (Новая Каледония)',
'NE' => 'Niger (Нигер)',
'NF' => 'Norfolk Island (Норфолк)',
'NG' => 'Nigeria (Нигерия)',
'NI' => 'Nicaragua (Никарагуа)',
'NL' => 'Netherlands (Нидерланды)',
'NO' => 'Norway (Норвегия)',
'NP' => 'Nepal (Непал)',
'NR' => 'Nauru (Науру)',
'NU' => 'Niue',
'NZ' => 'New Zealand (Новая Зеландия)',
'OM' => 'Oman (Оман)',
'PA' => 'Panama (Панама)',
'PE' => 'Peru (Перу)',
'PF' => 'French Polynesia (Французская Полинезия)',
'PG' => 'Papua New Guinea (Папуа - Новая Гвинея)',
'PH' => 'Philippines (Филиппины)',
'PK' => 'Pakistan (Пакистан)',
'PL' => 'Poland (Польша)',
'PM' => 'Saint Pierre and Miquelon (Сен-Пьер и Микелон)',
'PN' => 'Pitcairn Island (остров Питкэрн)',
'PR' => 'Puerto Rico (Пуэрто-Рико)',
'PS' => 'Palestine (Палестина)',
'PT' => 'Portugal (Португалия)',
'PW' => 'Palau (Палау)',
'PY' => 'Paraguay (Парагвай)',
'QA' => 'Qatar (Катар)',
'RE' => 'Reunion Island (остров Реюньон)',
'RO' => 'Romania (Румыния)',
'RU' => 'Russian Federation (Россия)',
'RW' => 'Rwanda (Руанда)',
'SA' => 'Saudi Arabia (Саудовская Аравия)',
'SB' => 'Solomon Islands (Соломоновы Острова)',
'SC' => 'Seychelles (Сейшельские Острова)',
'SD' => 'Sudan (Судан)',
'SE' => 'Sweden (Швеция)',
'SG' => 'Singapore (Сингапур)',
'SH' => 'Saint Helena (остров Святой Елены)',
'SI' => 'Slovenia (Словения)',
'SJ' => 'Svalbard and Jan Mayen Islands',
'SK' => 'Slovakia (Словакия)',
'SL' => 'Sierra Leone (Сьерра-Леоне)',
'SM' => 'San Marino (Сан-Марино)',
'SN' => 'Senegal (Сенегал)',
'SO' => 'Somalia (Сомали)',
'SR' => 'Suriname (Суринам)',
'ST' => 'Sao Tome and Principe (Сан-Томе и Принсипи)',
'SU' => 'exUSSR (СССР)',
'SV' => 'El Salvador (Сальвадор)',
'SY' => 'Syria (Сирия)',
'SZ' => 'Swaziland (Свазиленд)',
'TC' => 'Turks and Caicos Islands',
'TD' => 'Chad (Чад)',
'TF' => 'French Southern Territories',
'TG' => 'Togo (Того)',
'TH' => 'Thailand (Таиланд)',
'TJ' => 'Tajikistan (Таджикистан)',
'TK' => 'Tokelau (Токелау)',
'TL' => 'Timor-Leste',
'TM' => 'Turkmenistan (Туркменистан)',
'TN' => 'Tunisia (Тунис)',
'TO' => 'Tonga (Тонга)',
'TP' => 'East Timor (Восточный Тимор)',
'TR' => 'Turkey (Турция)',
'TT' => 'Trinidad and Tobago (Тринидад и Тобаго)',
'TV' => 'Tuvalu (Тувалу)',
'TW' => 'Taiwan (Тайвань)',
'TZ' => 'Tanzania (Танзания)',
'UA' => 'Ukraine (Украина)',
'UG' => 'Uganda (Уганда)',
'UK' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)',
'UM' => 'United States Minor Outlying Islands',
'US' => 'United States (США)',
'UY' => 'Uruguay (Уругвай)',
'UZ' => 'Uzbekistan (Узбекистан)',
'VA' => 'Holy See, Vatican (Ватикан)',
'VC' => 'Saint Vincent and the Grenadines (Сент-Винсент и Гренадины)',
'VE' => 'Venezuela (Венесуэла)',
'VG' => 'Virgin Islands, British (Виргинские острова, Британские)',
'VI' => 'Virgin Islands, US (Виргинские острова, США)',
'VN' => 'Vietnam (Вьетнам)',
'VU' => 'Vanuatu (Вануату)',
'WF' => 'Wallis and Futuna Islands',
'WS' => 'Western Samoa (Западное Самоа)',
'YE' => 'Yemen (Йемен)',
'YT' => 'Mayotte',
'YU' => 'Yugoslavia (Югославия)',
'ZA' => 'South Africa (ЮАР)',
'ZM' => 'Zambia (Замбия)',
'ZW' => 'Zimbabwe (Зимбабве)',
'--' => 'Неизвестная страна',
);
var $ip;
var $field = "country:";




function class_country_ip()
{
//CONSTRUCTOR
//echo $this->country("127.0.0.1");
}

function country($tmp_ip)
{	
$this->ip = $tmp_ip;
if ((ip2long($this->ip)==-1) or (ip2long($this->ip)===FALSE))
{
 return $this->country['--'].' (некорректный ip)';
}	

//на этом сервере стоит какая-то защита от такого метода. возвращается 403, хотя при открытии браузером никаких проблем нет
//$fp = @file("http://www.ripe.net/whois?form_type=simple&full_query_string=&searchtext={$this->ip}");
//$fp = @file("http://ripe.net/fcgi-bin/whois?form_type=advanced&full_query_string=&searchtext={$this->ip}&do_search=Search&inverse_attributes=None&ip_search_lvl=Default%28nearest+match%29&alt_database=RIPE&object_type=All");
$fp = @file("http://nic.ru/whois/?ip={$this->ip}");	


if (!is_array($fp)) { $this->country['--'].' (не могу открыть канал)'; }

$lineaok = array();
$i = 0;
while (list ($line_num, $line) = each ($fp)) {
 if(stristr($line,$this->field)!=""){ // find field
	 $i++;
	 $lineaok[$i]['line']=$line;
	 $sign = substr(trim(str_replace(" ","",str_ireplace($this->field,"",$line))),0,2);
	 $lineaok[$i]['value']=$sign;
	 $lineaok[$i]['note']=$this->country[$sign];
 }
}

if (count($lineaok)<1) { //no matchs
 return $this->country['--'].' (нет записи о стране)';
} else {
 foreach ($lineaok as $entry)
 {	
	 if (is_array($entry)) { // is a really match
   if (strlen($entry['note'])>0) { //got a country name in match
  	 return $entry['note'];
   } else { 
  	 $result = $this->country['--'].' (неизвестный код: '.$entry['value'].')';
   }
	 } else { 
   $result = $this->country['--'].' (структура нарушена)'; //incorrect structure
	 }
 }
}

return $result;
}


} //end class

?>

 

в рутовом index.php находим

require KERNEL_PATH."class_converge.php";

 

и НИЖЕ вставляем:

require ROOT_PATH."sources/classes/whois.php";
$ip_base = new class_country_ip();

 

теперь идем в /sources/online.php и находим

	function list_all()
{
 global $ibforums, $DB, $std, $forums;

 

ЗАМЕНЯЕМ на

	function list_all()
{
 global $ibforums, $DB, $std, $forums, $ip_base;

 

потом находим

$sess['where_line'] = $line;

 

и НИЖЕ вставляем

$sess['country'] = "<br />".$ip_base->country($sess['ip_address']);

 

потом находим

	return $this->html->show_row($sess);

 

и ВЫШЕ вставляем

	$sess['member_name'] .= $sess['country'];

 

вот такая вот петрушка.

теперь по ссылке со списком "кто в онлайне" можно под ником увидеть страну.

Изменено пользователем Anna
Ссылка на комментарий
Поделиться на других сайтах

До того как ты написал, я забыла вот это:

 

online.php

function list_all()
{
global $ibforums, $DB, $std, $forums, $ip_base;

 

проверь.[1123688439:1123688489]И если не пашет - потрудись написать что именно и что выдается.

Ссылка на комментарий
Поделиться на других сайтах

Вот тебе база:

http://www.flags.net/fullindex.htm

если сделаешь зип с картинками и массивчик со ссылками типа

array( 
'RU' => '/images/ru.gif',
...
);

 

я тебе буду безмерно благодарна![1123688779:1123689378]У меня вопрос - есть ли предложения по тому, как сделать этот мод быстрее, потому что при большом кол-ве пользователь он у меня иногда даже не укладывается в 30 секунд.

Ссылка на комментарий
Поделиться на других сайтах

использовать готовые базы, а не WHOIS сервера... которые еще и лимиты имеют на количество запросов в день.

 

P.S. для справедливости авторов идеи указывать стоит.

Ссылка на комментарий
Поделиться на других сайтах

Да-да. Прошу прощения.

Вобщем идея такой модификации принадлежит IBresource (не знаю кому именно).

Верно? :D

Ссылка на комментарий
Поделиться на других сайтах

Верно.

 

Оптимизация определения страны:

$fp = @file("http://nic.ru/whois/?ip=".$this->ip);

foreach ( $fp as $line ) {
   if ( stristr( $line, 'country' ) ) {
       preg_match( '~([a-z]+)(?=<br>)~i', $line, $match );
       $countryCode = strtoupper( $match[1] );
       break;
   }
}

$countryName = $this->country[ $countryCode ]

 

в общем то и все...

Ссылка на комментарий
Поделиться на других сайтах

А нигде случайно нету бесплатных GeoIP баз?

Я думаю основные страны можно забить в базу,

а там как Anna, проверять код страны и диапазон IP адерса,

тем самым проверка будет моментальная, такой скрипт я и сам даже

могу написать, нужен только файл с диапазонами и кодами.

Ссылка на комментарий
Поделиться на других сайтах

>>А нигде случайно нету бесплатных GeoIP баз?

 

а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза.

Ссылка на комментарий
Поделиться на других сайтах

У меня вопрос - есть ли предложения по тому, как сделать этот мод быстрее, потому что при большом кол-ве пользователь он у меня иногда даже не укладывается в 30 секунд.

 

использовать готовые базы, а не WHOIS сервера... которые еще и лимиты имеют на количество запросов в день.

 

А может пусть генерирует эту базу (раз уж ГеоАйПи платное) в одну таблицу, которую надо присоединять ЛЕФТ ДЖОЙНом, и если не нашло страны из таблицы, то определять через WhoIs и делать вставку в ту таблицу ) ?

 

Постоянных посетителей не будет проверять по нескольку раз ;).

 

Хотя вместо одной нагрузки будет другая нагрузка на БД ... :D

Ссылка на комментарий
Поделиться на других сайтах

ага ;))) попробовать стоит :)))

 

Как по вашему мнению лучше предсталять айпи - в виде поля-строки "235.255.251.211" (14 байт) или в виде 4-х полей tinyint unsigned (4 байта)? т.е. в каком случае индексы будут оптимальней...?

 

Или может в одним числовым тут можно обойтись!? :D

Ссылка на комментарий
Поделиться на других сайтах

Лучше брать по маске подсети, т.е. последнюю цифру лучше не учитывать. А если уж очень хочется цифру, то можно паковать в int, это вроде даже стандартная функция есть.
Ссылка на комментарий
Поделиться на других сайтах

А может во время вставки сессии определять и записывать в поле?
Ссылка на комментарий
Поделиться на других сайтах

Внатуре - сделать кэширование и будет вам самообучаемая база данных.

я еще раз повторяю, существует лимит на количество обращений к WHOIS сервису. Базу вы обучать будете несколько лет при таком раскладе. А на форумах с большим кол-вом посещений вы просто будете упираться в лимит.

 

Все что вам нужно это GeoIP база, или mod_geo для Apache.

 

Не выдумывайте, этот вопрос я изучил еще год назад, так что все идеи по этому поводу я уже читал и анализировал. Выход только один - специализированная база. Да для тех кто захочет вытаскивать города из WHOIS, сразу предупреждаю что все базы WHOIS серверов не являются однозначно заполнеными, так что в поле address не обязательно будет содержаться город. Кстати страны тоже не всегда указываются.

Ссылка на комментарий
Поделиться на других сайтах

я месяца полтора мучал этот вопрос.....

 

все рашается через кеширование но со специализированной и обработанной базой в инете такого нет :D

 

как я уже писал раньше все решается с помощью одной прекрассной формулы...

Ссылка на комментарий
Поделиться на других сайтах

Извращенцы! =) Мне вас жалко...

 

может и еще проще решается, все возможно :)

(можно вообще использовать бинарный поиск по файлу c IP, но тоже извращенство)

 

 

ЗЫ: в первый раз я решил проблемму в двадцать строк, эффектно но эффективно(тест показал), ща подругому все ;)

 

 

ЗЫЫ: только не подумайте что юзается бесплатная база ip2counrtry :D

Ссылка на комментарий
Поделиться на других сайтах

да выскожу свое мнение, сам реализовывал такую фичу, но черз WhoIs это медленно и невозможно из-за ограничений как сказад GiV.

 

GeoIP в этом случае самое лучшее решение. Самый лучший вариант это когда на сервере стоит, но GeoIP можно и так использовать но нужна база, которую реально найти.))) Именно через него делал у себя[1123759584:1123760227]

Да-да. Прошу прощения.

Вобщем идея такой модификации принадлежит IBresource (не знаю кому именно).

Верно? :D

 

Вот тебе флаги flags.zip

Ссылка на комментарий
Поделиться на других сайтах

а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза.

 

Ничего там не находится, 50$ заплати тогда найдётся тебе база. Поэтому и спрашиваю. http://www.maxmind.com/ - здесь кое-что есть, но этот сайт я ещё нашёл довольно давно. там и модули для апача есть.

 

Дану не легче считывать из поля Откуда город или страну и выводить в список онлайн, иначе только лишнии тормоза ИМХО.

Ссылка на комментарий
Поделиться на других сайтах

а ты чисто случайно не знаешь что есть такое как google.ru ??? находиться аж бегом с первого раза.

 

Ничего там не находится, 50$ заплати тогда найдётся тебе база. Поэтому и спрашиваю. http://www.maxmind.com/ - здесь кое-что есть, но этот сайт я ещё нашёл довольно давно. там и модули для апача есть.

 

Дану не легче считывать из поля Откуда город или страну и выводить в список онлайн, иначе только лишнии тормоза ИМХО.

Нет при установленом модуле Апача никаких лишних тормозов. пока не заметил.

правда у мя пиковая нагрузка последнее время не более 30 онлайн, но тормозов нет. дабы страна определятся при старте сессии и пишется в таблицу.

Ссылка на комментарий
Поделиться на других сайтах

Правильно у тебя на локалке стоит модуль, а для начала нужно попробывать хотябы поставить на хостинге, что там врятли разрешат, и затестить на форумах где в онлайн более 300 человек. =)
Ссылка на комментарий
Поделиться на других сайтах

Правильно у тебя на локалке стоит модуль, а для начала нужно попробывать хотябы поставить на хостинге, что там врятли разрешат, и затестить на форумах где в онлайн более 300 человек. =)

Ну вон на хостинге все крутится можешь посмотреть, адрес в профиле. Да и при 300 не будет разници, дабы это опеределяется еще как только пользователь пришел на хост.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.