Сейчас я работаю над сайтом, который должен получать фиды пользователей. Но как мне лучше всего оптимизировать выборку, если у меня есть база данных с, скажем, 300 фидами. Я собираюсь настроить задание cron, которое будет извлекать фиды, но должен ли я делать это примерно 5 раз в секунду или что-то в этом роде?
Есть идеи, как это сделать лучше всего в PHP?






Основываясь на новой информации, я бы сделал что-то вроде этого:
Позвольте «первому» клиенту инициировать обновление и сохранить с ним метку времени. Все другие клиенты, которые будут запрашивать информацию, получают обналичиваемую информацию, пока эта информация не станет устаревшей. Следующее обращение клиента обновит кэш, который затем будет использоваться всеми клиентами до тех пор, пока он не станет старым.
Клиент, который фактически инициирует обновление, не должен ждать, пока он перейдет на финский, просто обслуживайте старую кэшированную версию и продолжайте делать это до тех пор, пока работа не будет завершена.
Таким образом, вам не нужно обновлять что-нибудь, если его не запрашивают клиенты.
Лучше всего вести себя «вежливо» и не перегружать каналы множеством ненужных запросов. Я остановился на 1 часе обновления для одного из моих веб-приложений, которое отслеживает обновления около 150 блогов. Я сохраняю время их последней проверки в базе данных и использую это, чтобы решить, когда их обновлять. Каналы добавлялись в случайное время, поэтому не все они обновлялись одновременно.
Я написал pfetch, чтобы сделать это за меня. Он небольшой, но имеет пару действительно важных аспектов:
На самом деле я написал это, потому что мои сборщики на основе cron становились проблемой. Теперь он настроен на получение случайных вещей из Интернета, а затем запускает сценарии всякий раз, когда что-то меняется, чтобы обновлять части моего собственного веб-сайта.
Если я понимаю ваш вопрос, вы в основном работаете над сайтом агрегатора кормов?
Вы можете сделать следующее: начните с обновления каждые 1 час (например). Когда у вас мало записей из какой-то ленты - посчитайте средний интервал между записями. Затем используйте этот интервал как интервал для получения этого фида.
Например, если сайт опубликовал 7 статей за последние 7 дней - вы можете получать с него фиды каждые 24 часа (1 день).
Я использую этот алгоритм с небольшими изменениями, когда я вычисляю этот средний интервал, я делю его на 2 (чтобы не получать слишком редко). Если результат меньше 60 минут - устанавливаю интервал 1 час или больше 24 - 24 часа.
Например, примерно так:
public function updateRefreshInterval() {
$sql = 'select count(*) _count ' .
'from article ' .
'where created>adddate(now(), interval -7 day) and feed_id = ' . (int) $this->getId();
$array = Db::loadArray( $sql );
$count = $array[ '_count' ];
$interval = 7 * 24 * 60 * 60 / ( $count + 1 );
$interval = $interval / 2;
if ( $interval < self::MIN_REFRESH_INTERVAL ) {
$interval = self::MIN_REFRESH_INTERVAL;
}
if ( $interval > self::MAX_REFRESH_INTERVAL ) {
$interval = self::MAX_REFRESH_INTERVAL;
}
Db::execute( 'update feed set refresh_interval = ' . $interval . ' where id = ' . (int) $this->getId() );
}
Таблица представляет собой «канал», «обновлено» - это отметка времени, когда канал последний раз обновлялся, а «интервал_обновления» - это желаемый интервал времени между двумя выборками одного и того же канала.