Чтение только при обновлении данных XML

Я могу разобрать RSS с PHP. Я ищу, чтобы иметь возможность получать только обновленный контент и ничего не делать, если в RSS не будет нового обновления.

Например, у меня есть этот RSS-файл , и если нет нового контента, ничего не происходит, но если есть новый контент, я хочу отправить своим пользователям последнее обновление RSS и не повторно отправить то, что у них уже есть. Я разбираю и отправляю название и ссылку.

Я использую cronjob для проверки каждого часа на обновление. Мой вопрос в том, как я могу сказать, что фид теперь обновлен и не совпадает с последним? Вот PHP-файл, который я использую для чтения RSS. Могу ли я написать последний контент в файл и сравнить его или есть ли другой способ определить, что контент теперь отличается от последнего?

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

Опять же, кто-то предложил HTTP Cache – я не мог найти простую демоверсию, поэтому я практически застрял.

Любое дальнейшее предложение будет высоко оценено.

Solutions Collecting From Web of "Чтение только при обновлении данных XML"

Вы можете использовать хеши для этого двумя способами:

  1. Чтобы облегчить обновление – при запросе обновления вы хэш весь фид и сравниваете результат с хешем с последнего раза – если они идентичны, вы знаете, что фид не изменился и может остановиться, даже после его синтаксического разбора.
  2. Чтобы определить изменения – при разборе вы хэш каждого элемента и сравниваете его с хэшами, хранящимися в предыдущих прогонах. Если он соответствует одному, вы знаете, что видели его раньше.

Если интересующий вопрос предлагает подсказки для своих элементов, вы можете усовершенствовать этот процесс, сохранив хеш-пары guid <>. Это ускорит сравнение, так как вы сравниваете элементы только с известными предыдущими версиями вместо сравнения со всеми предыдущими элементами.

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

HTTP Conditional GET , вероятно, так же близко, как и вы, чтобы получить то, что вы хотите.

Из-за разнообразия rss нет простого решения проблемы, которую вы подняли. Основная проблема заключается в том, как определить уникальность rss-объекта. Он может быть ориентировочным, публиковать время или контент, но может быть сложно обнаружить это автоматически.

Когда вы узнаете критерии уникальности, вы можете сохранить все «старые» предметы и сравнить их с новейшими, которые вы получите.

Заголовки HTTP Cache Control и Expires могут использоваться как оптимизация для сайтов, которые поддерживают это, но, к сожалению, некоторые из них этого не делают.

Решение Хенрика правильное, однако было бы проще предоставить вам пример данных хэширования:

// 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 } } 

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

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

Ваши клиенты всегда будут запрашивать данные вашего фида, чтобы вы не могли контролировать их, когда они спрашивают. Я не думаю, что большинство читателей каналов подчиняются заголовкам HTTP Cache Control / Expires, поэтому вы не можете рассчитывать на использование спецификации HTTP и кэширования HTTP-кеширования.

Я считаю, что лучше всего просто кэшировать свой последний ответ и отправлять все последующие запросы из кеша – соответственно обновлять кеш при внесении изменений. Эффективно это означает, что ваши затраты на реагирование на каждый клиент и его устаревшие данные почти близки к 0, если вы просто извлекаете их из memcache или файловой системы.