PHP: кэшируйте данные RSS, чтобы не запрашивать их при каждой загрузке страницы - PullRequest
1 голос
/ 11 марта 2010

Я анализирую данные из этого канала RSS: http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=SAM|AR|AR005|MONTE%20MAIZ, Данные там обновляются один раз в час.

Чтобы разобрать его, я загружаю RSS при инициализации моего класса и преобразую его в пригодный для использования объект.

Проблема в том, что каждый раз, когда страница загружается, RSS снова анализируется, а HTTP-запрос задерживает загрузку страницы.

Я думал о cronjob для ежечасного анализа RSS, а затем сохранения данных в структуре JSON. Но я бы очень хотел не зависеть от cron, так как не все серверы общего хостинга предоставляют его (хотя и должны).

Любые другие предложения о том, как это сделать?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Вы можете использовать Zend_Cache . Сервер будет загружать каналы в первый раз, но последующие вызовы будут использовать кеш.

На самом деле, я реализовал то, что вы подробно описали:

private function _loadFeedEntries($url)
{
    $cache = $this->_getCacheObj();
    $md5   = md5($url);
    if ($result = $cache->load("feed_{$md5}")) {
        return $result;
    }
    $entries = array();
    try {
        $feed = @Zend_Feed::import($url);
        foreach ($feed as $entry) {
            $entries[] = $entry;
        }
    } catch (Exception $e) {
        // ignore this feed.
    }

    $cache->save($entries, "feed_{$md5}");

    return $entries;
}

private function _getCacheObj()
{
    $frontendOptions = array(
        'lifetime' => self::CACHE_LIFETIME,
        'automatic_serialization' => true
    );

    $backendOptions = array(
        'cache_dir' => self::CACHE_DIR
    );

    return Zend_Cache::factory(
        'Core',
        'File',
        $frontendOptions,
        $backendOptions
    );
}

Вы все еще можете сделать cronjob для вызова _loadFeedEntries (), который будет кешировать результат. Вы можете даже сделать cronjob в своей системе, чтобы переходить на ваш сайт каждые CACHE_LIFETIME секунды, тем самым «поддерживая» кэш обновленным.

1 голос
/ 11 марта 2010

Вы можете выполнять (очень) простое кэширование по запросу страницы, чтобы не полагаться на cron.

То есть:

Когда клиент запрашивает вашу страницу, попробуйте загрузить данные из файла кэша. Если файл кэша не существует или он слишком старый, перейдите на RSS-канал службы для обновления и запишите его в файл кэша.

Если вы пишете в кеш с

file_put_contents( FILENAME, json_encode( $some_data_structure ));

Вы можете прочитать это с помощью простого

json_decode( file_get_contents( FILENAME ));

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