Last active
August 29, 2015 14:17
-
-
Save Fedcomp/e270f750d67845534004 to your computer and use it in GitHub Desktop.
PHP Psychostats GeoIP updater
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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