mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-01-26 22:27:58 -05:00
Actualize : évite d'ajouter les articles déjà connus
Dans la plupart des cas, évite d'ajouter les articles déjà présents dans la base de données, en faisant une pré-requête (une par flux, pas une par article). Par exemple, si un flux RSS fournit 20 articles, alors la pré-requête charge une liste d'exclusion de 20+2 identifiants d'articles. Ce patch réduit considérablement le nombre de requêtes et la charge de la base de données durant les mises à jour, et en particulier le trafic réseau entre PHP et la base de données. Les mises à jour sont du coup aussi plus rapides.
This commit is contained in:
@@ -150,14 +150,18 @@ class feedController extends ActionController {
|
||||
$feed->load ();
|
||||
$entries = $feed->entries ();
|
||||
|
||||
//For this feed, check last n entry IDs already in database
|
||||
$existingIds = array_fill_keys ($entryDAO->listLastIdsByFeed ($feed->id (), count($entries) + 2), 1);
|
||||
|
||||
// ajout des articles en masse sans se soucier des erreurs
|
||||
// On ne vérifie pas que l'article n'est pas déjà en BDD
|
||||
// car demanderait plus de ressources
|
||||
// La BDD refusera l'ajout de son côté car l'id doit être
|
||||
// unique
|
||||
foreach ($entries as $entry) {
|
||||
if ($entry->date (true) >= $date_min ||
|
||||
$feed->keepHistory ()) {
|
||||
if ((!isset ($existingIds[$entry->id ()])) &&
|
||||
($entry->date (true) >= $date_min ||
|
||||
$feed->keepHistory ())) {
|
||||
$values = $entry->toArray ();
|
||||
$entryDAO->addEntry ($values);
|
||||
}
|
||||
|
||||
@@ -439,6 +439,14 @@ class EntryDAO extends Model_pdo {
|
||||
public function listByFeed ($feed, $state, $order = 'high_to_low', $limitFromId = '', $limitCount = '') {
|
||||
return $this->listWhere (' WHERE id_feed = ?', $state, $order, $limitFromId, $limitCount, array ($feed));
|
||||
}
|
||||
|
||||
public function listLastIdsByFeed($id, $n) {
|
||||
$sql = 'SELECT id FROM ' . $this->prefix . 'entry WHERE id_feed=? ORDER BY date DESC LIMIT ' . intval($n);
|
||||
$stm = $this->bd->prepare ($sql);
|
||||
$values = array ($id);
|
||||
$stm->execute ($values);
|
||||
return $stm->fetchAll (PDO::FETCH_COLUMN, 0);
|
||||
}
|
||||
|
||||
public function countUnreadRead () {
|
||||
$sql = 'SELECT is_read, COUNT(*) AS count FROM ' . $this->prefix . 'entry e INNER JOIN ' . $this->prefix . 'feed f ON e.id_feed = f.id WHERE priority > 0 GROUP BY is_read';
|
||||
|
||||
Reference in New Issue
Block a user