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

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


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

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

Получение кода страны из 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 не будет разници, дабы это опеределяется еще как только пользователь пришел на хост.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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