PHP: Cache RSS veri her sayfa yükler bunu isteyen önlemek için

2 Cevap php

Bu RSS beslemesine verileri ayrıştırma ediyorum: http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=SAM|AR|AR005|MONTE%20MAIZ, veriler her saat orada bir kez güncellenir.

Ayrıştırmak, benim sınıf ilklendirirken RSS yük ve kullanılabilir bir nesne haline dönüştürmek.

Bu sorun sayfa yüklendiğinde her zaman, RSS tekrar ayrıştırılır olmasıdır, ve HTTP isteği sayfa yükleme geciktirir.

Ben saatlik RSS ayrıştırmak için cronjob düşünme, ve sonra bir JSON yapısı verileri kaydetmek oldu. (Olması gerektiği halde) ama gerçekten tüm sunucular bunu sağlamak hosting olarak değil, cron bağlı değildir istiyorum.

Bunun nasıl başka önerileriniz?

2 Cevap

Sen kullanabilirsiniz Zend_Cache. Sunucu beslemeleri ilk kez yüklemek, ancak daha sonra aramalar önbelleğini kullanacak.

Aslında, ben size ayrıntılı ne uyguladık:

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
    );
}

You still can make cronjob to call _loadFeedEntries(), which will cache the result. You can even make cronjob in your system to navigate to your site every CACHE_LIFETIME seconds, thus "keeping" the cache updated.

Sen cron dayanarak önlemek için, sayfa istek üzerine (çok) basit önbelleğe yapabilirdi.

Yani:

İstemci sayfa istediğinde, önbellek dosyasından veri yükleme deneyin. Önbellek dosyası var, ya da çok eski değilse, bir güncelleştirme için hizmetin RSS beslemesi vurmak ve bir önbellek dosyaya yazmak.

Eğer ile önbellek yazarsan

file_put_contents( FILENAME, json_encode( $some_data_structure ));

basit bir ile okuyabilirsiniz

json_decode( file_get_contents( FILENAME ));