Skip to content

Instantly share code, notes, and snippets.

@Fedcomp
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fedcomp/e270f750d67845534004 to your computer and use it in GitHub Desktop.
Save Fedcomp/e270f750d67845534004 to your computer and use it in GitHub Desktop.
PHP Psychostats GeoIP updater
#!/usr/bin/env php
<?php
/*
========== Psychostats GeoIP updater ==============
Автор: Fedcomp
Для работы необходимо php расширение для работы ZIP.
php_zip.dll для windows.
Простой скрипт для обновления IP адресов стран в базе данных psychostats.
*/
// Настройки. Настроено под мою локалку, изменяйте под себя.
$mysql_host = '127.0.0.1'; // Хост. Адрес mysql сервера
$mysql_user = 'mbot'; // Пользователь Mysql
$mysql_pass = 'mbot'; // Пароль Mysql
$mysql_db = 'mbot'; // Название базы данных с таблицами psychostats
$mysql_tablename_ip = 'ps_geoip_ip';// Название таблицы с GeoIP психостата
$mysql_tablename_cc = 'ps_geoip_cc';// Название таблицы с GeoIP психостата
$download_link = 'http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip'; // Ссылка с которой скрипт загружает свежие записи
// Количество списков с IP которые будут обрабатываться за один запрос.
// Допустим 10 IP диапазонов за один запрос.
// В 10 раз ускоряет выполнение скрипта. Значения больше 100 не рекомендуются
define('PER_QUERY', 100);
// == // Конец настроек =========
/*
array(6) {
[0] =>
string(7) "1.0.0.0"
[1] =>
string(9) "1.0.0.255"
[2] =>
string(8) "16777216"
[3] =>
string(8) "16777471"
[4] =>
string(2) "AU"
[5] =>
string(9) "Australia"
}
*/
define('CSV_IP_START', 2);
define('CSV_IP_END', 3);
define('CSV_COUNTRY_CODE_FIELD',4);
define('CSV_COUNTRY_NAME_FIELD',5);
// Подключаемся к базе
if(!$db_link = @mysqli_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_db))
die('Ne mogu podlu4ica k mysql: '. mysqli_connect_error() . "\n");
// Проверяем существует ли таблица со списокм айпи
if (mysqli_num_rows(mysqli_query($db_link, "SHOW TABLES LIKE '{$mysql_tablename_ip}'")) == 0)
die('Tablica ne ukazana ili nazvanie neverno. $mysql_tablename_ip:' . $mysql_tablename_ip . "\n");
// Проверяем существует ли таблица с названием стран
if (mysqli_num_rows(mysqli_query($db_link, "SHOW TABLES LIKE '{$mysql_tablename_cc}'")) == 0)
die('Tablica ne ukazana ili nazvanie neverno. $mysql_tablename_cc:' . $mysql_tablename_cc . "\n");
echo "Ska4ivaem bazu s novimi ip: {$download_link}\n";
file_put_contents('db.zip', file_get_contents($download_link));
echo "Otkrivaem zip archive\n";
$z = new ZipArchive();
if (!$z->open('db.zip')) die("archive povrejden.\n");
if(!$fp = $z->getStream('GeoIPCountryWhois.csv')) die("archive povrejden.\n");
$ips = array();
$countries = array();
while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
$countries[$data[CSV_COUNTRY_CODE_FIELD]] = $data[CSV_COUNTRY_NAME_FIELD];
$ips[] = array(
'cc' => $data[CSV_COUNTRY_CODE_FIELD],
'start' => $data[CSV_IP_START],
'end' => $data[CSV_IP_END],
);
}
fclose($fp);
@unlink('db.zip');
// Сначала удаляем старые записи с названиями стран
mysqli_query($db_link, "TRUNCATE {$mysql_tablename_cc}");
foreach($countries as $cc => $cn){
mysqli_query($db_link, "
INSERT INTO `{$mysql_tablename_cc}` (`cc`, `cn`)
VALUES ('" . mysqli_real_escape_string($db_link, $cc) . "', '" . mysqli_real_escape_string($db_link, $cn) . "');
");
echo "$cc => $cn\n";
}
// Сначала удаляем старые записи со списком айпи
mysqli_query($db_link, "TRUNCATE {$mysql_tablename_ip}");
for($i=0;$i<ceil(count($ips)/PER_QUERY);$i++){
$offset = $i*PER_QUERY;
$sql = "INSERT INTO `{$mysql_tablename_ip}` (`cc`, `start`, `end`)\nVALUES ";
// Foreach values
for($j=0;$j<PER_QUERY and count($ips)-$offset != $j;$j++) $sql .= '(' .
"'".mysqli_real_escape_string($db_link, $ips[$offset+$j]['cc'])."',"
. (int) $ips[$offset+$j]['start'] . ','
. (int) $ips[$offset+$j]['end'] .
"),\n";
$sql = substr($sql, 0, -2); // Вырезаем перевод строки и запятую;
mysqli_query($db_link, $sql);
echo "{$ips[$offset]['cc']} => {$ips[$offset]['start']}<{$ips[$offset]['end']}\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment