XML veri güncellenir iken okunur

5 Cevap php

I'm able to parse RSS with PHP - What I'm looking for is to be able to get only the updated content, and do nothing if there's no new update to the RSS.

Örneğin, ben bu RSS File var, ve yeni içerik varsa, hiçbir şey olmuyor, ancak yeni bir içerik varsa, benim kullanıcıların son RSS güncellemesi göndermek istiyorum, ve onlar zaten ne yeniden değil. Ben ayrıştırma ve başlık ve tek linki yolluyorum.

Ben güncelleme için her saat kontrol etmek cronjob kullanın. Benim soru nasıl yem şimdi güncellenen ve son olarak aynı olmadığını söyleyebilir mi? İşte RSS okumak için kullanıyorum PHP file bu. Onları dosya ve karşılaştırmak için son içerik yazmak veya içerik artık son farklı olduğunu belirlemek için başka bir yolu var mı?

Hala işe almak için çalışıyorum çünkü Update: Ben bu yazıyı diriltmek zorunda kaldı. Birkaç cevapları kabul etmesine rağmen, onlar örneğin karma seçenek başlangıçta iyi bir fikir gibi görünüyordu, uygulamak çok zor olmuştur, ama RSS binlerce kontrol edileceği gibi, hepsini karma neredeyse imkansız olurdu.

Yine, birisi HTTP Cache önerdi - Ben hemen şaşırıp yüzden basit bir demo bulamadı.

Herhangi bir başka önermek son derece mutluluk duyacağız.

5 Cevap

Bunu iki şekilde, bunun için sağlamalarının kullanabilirsiniz:

  1. Güncellenmesi kolaylaştırmak için - bir güncelleştirme isterken, bütün yem karma ve son kez karma ile karşılaştırmak - aynıysa, sen yem değişmedi ve hatta ayrıştırma önce durdurmak olduğunu biliyoruz.
  2. Değişiklikleri tespit etmek - ayrıştırma üzerinde, her bir öğeyi karma ve daha önceki çalışmalardan saklanan sağlamalarının karşılaştırın. Bu eşleşirse, size daha önce de gördüm biliyorum.

Söz yem öğelerinden için GUID'lerine sunuyor Eğer guid <> karma çiftleri depolayarak bu süreci rafine olabilir. Eğer yerine sadece önceki tüm öğeleri karşılaştırarak bilinen önceki sürümlerine öğeleri karşılaştırmak gibi bu karşılaştırma daha hızlı olur.

Hala sınırları içinde depolanan sağlamalarının miktarda tutmak için bazı erme / tasfiye mekanizması gerekir, ama yalnızca (seçilen karma algoritması bağlı) nispeten kısa dizeleri depolamak verilen, performansı almadan önce uzunca bir bekleme listesi tutmak gerekir sorunlar.

HTTP Conditional GET muhtemelen ne istediğinizi almak için gidiyoruz olarak yakındır.

Because of the diversity of rss there is no easy solution for the problem your raised. The main issue is how to determine the uniqueness of the rss item. It can be guid, publish time or content itself, but it maybe tricky to detect that automatically.

Eğer teklik kriterleri öğrendikten sonra bütün 'eski' öğelerini kalıcı ve aldığınız yeni olanlar için bunları karşılaştırabilirsiniz.

HTTP Cache Kontrol ve başlıkları Expires olduğunu destekleyen siteleri için bir optimizasyon olarak kullanılabilir, ama ne yazık ki bazı değildir.

@ Henrik çözümü doğru, ancak karma verilere örnek ile tedarik kolay olabilir:

// hash the three channel variables
$hash = sha1($channel_title . $channel_link . $channel_desc);

// here you should check the currently stored database hashed 
// value against current hash value to see if any channel variables
// have recently changed
if ($database_hash != $hash) {
    // you need to update the channel data in your database
    // including the new hash value
}

for ($i = 0; $i < 3; $i++) {

    // hash the item values
    $hash = $item_title . $item_link . $item_description

    // here you should check the currently stored database hashed 
    // value against all item hash values to see if any item variables
    // have recently changed
    if ($database_hash != $hash) {
        // you need to update the item data in your database
        // including the new hash value
    }

}

Eğer XML dosyasında herhangi bir veri olursa olsun değiştirilmiş olup olmadığını belirlemek için hızlı bir kontrol yapmak istiyorsanız Ayrıca, bir dize olarak XML karma olabilir. Bu değeri depolamak ve buna karşı siz değeri (değişti XML dosyası içindeki bazı verileri gösteren) değişip değişmediğini görmek için cronjob çalıştırmak her zaman kontrol etmelisiniz.

$overall_hash = sha1($xmlDoc->saveXML());

Mutlaka when onlar sormak kontrol edemez böylece müşterilerine her zaman ilerleme verileri için soran olacaktır. Ben en çok yem okuyucuların HTTP spec ve kaldıraç HTTP önbelleğini kullanarak güvenemez böylece HTTP Önbellek Kontrolü / başlıklarını Bitiş itaat sanmıyorum.

Değişiklik yapıldığında uygun önbelleği güncellenmesi - Ben senin en iyi bahis sadece son yanıtı önbelleğe ve önbellekten sonraki tüm istekleri göndermek için olduğunu düşünüyorum. Etkili bu sadece memcache veya dosya sistemi çekin eğer her müşteri ve bayat verilere yanıt maliyet, hemen hemen 0'a yakın olduğu anlamına gelir.