Я бы выбрал первый вариант если данные должны быть постоянно обновлены, в противном случае я бы выбрал ваш второй вариант.
Вот метод, который я разработал несколько лет назад и который был частью класса GeoIP:
function Update()
{
$result = false;
$databases = glob(HIVE_DIR . 'application/repository/GeoIP/GeoIP_*.dat');
foreach ($databases as $key => $value)
{
$databases[$key] = basename($value);
}
$databases[] = 'GeoIP.dat.gz';
$date = date('ym');
if ((!in_array('GeoIP_' . $date . '.dat', $databases)) && (date('j') >= 2))
{
if ($this->Hive->Filesystem->Write(HIVE_DIR . 'application/repository/GeoIP/GeoIP.dat.gz', file_get_contents('http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz'), false) === true)
{
$handler = gzopen(HIVE_DIR . 'application/repository/GeoIP/GeoIP.dat.gz', 'rb');
$result = $this->Hive->Filesystem->Write(HIVE_DIR . 'application/repository/GeoIP/GeoIP_' . $date . '.dat', gzread($handler, 2 * 1024 * 1024), false);
gzclose($handler);
foreach ($databases as $database)
{
$this->Hive->Filesystem->Delete(HIVE_DIR . 'application/repository/GeoIP/' . $database);
}
}
}
return $result;
}
В основном Update()
выполнялся каждый раз, затем он проверял, равен ли день месяца или больше 2 (MaxMind выпускает базы данных GeoIP в первый день месяца) и , если база данных за этот месяц еще не существовала. Только если оба эти условия, где true, метод будет загружать, распаковывать, переименовывать базу данных и удалять все старые базы данных за предыдущие месяцы.
В вашем случае, поскольку вы имеете дело с локалями, периодическая проверка, подобная этой, время от времени может быть плохой идеей, поскольку страны меняют вещи (имена, валюты, телефонные коды и т. Д.) много.