Целесообразно ли в приложении загружать данные с внешнего веб-ресурса, когда локальные данные недоступны? - PullRequest
1 голос
/ 25 декабря 2009

Некоторое время назад я натолкнулся на сценарий, который в основном извлекал список стран / государств из веб-ресурса, если он не находился в базе данных, и этот сценарий затем заполнял бы базу данных этим содержимым и с тех пор полагался бы на них с тех пор.

Поскольку я работаю над собственным классом локализации, я буду использовать те же данные локали, которые использует Zend, в виде примерно ~ 60 или около того XML-файлов, которые содержат локализованные данные, такие как страны, языки для локали.

Я полагаю, поскольку среда, над которой я работаю, будет теперь полагаться на эти файлы (там, где их сейчас нет), и ни на одном из серверов теперь нет этих данных, если я:

  • Настройка моего веб-приложения для загрузки этих файлов с центрального сервера, где весь контент хранится в .tar.gz, распаковывает их, хранит их на сервере и затем полагается на них
  • Создайте отдельный скрипт для этого, а не делайте это внутри приложения.

Псевдокод:

if ( !data ) {
    resource = getFile( 'http://central-server.com/tar.gz' );
    if ( resource ) {
        resource = unpack( directory, resource )
        return true
    }
    throw Exception('could not download files.')
}

Ответы [ 3 ]

1 голос
/ 25 декабря 2009

Загрузите скрипт установки или выведите ошибку, если она недоступна. Загрузка по запросу с сервера может привести к тайм-ауту и, скорее всего, к отказу пользователей. fsockopen - это самый простой способ сделать это и иметь дело с сокетами вручную, если у вас нет настройки CURL и вы не можете открывать / копировать удаленные файлы.

1 голос
/ 25 декабря 2009

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


Вот метод, который я разработал несколько лет назад и который был частью класса 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, метод будет загружать, распаковывать, переименовывать базу данных и удалять все старые базы данных за предыдущие месяцы.

В вашем случае, поскольку вы имеете дело с локалями, периодическая проверка, подобная этой, время от времени может быть плохой идеей, поскольку страны меняют вещи (имена, валюты, телефонные коды и т. Д.) много.

1 голос
/ 25 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...