Просмотр исходного кода

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.
Alexandre Alapetite 12 лет назад
Родитель
Сommit
fdb2b7588e
2 измененных файлов с 14 добавлено и 2 удалено
  1. 6 2
      app/controllers/feedController.php
  2. 8 0
      app/models/Entry.php

+ 6 - 2
app/controllers/feedController.php

@@ -150,14 +150,18 @@ class feedController extends ActionController {
 				$feed->load ();
 				$feed->load ();
 				$entries = $feed->entries ();
 				$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
 				// 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
 				// On ne vérifie pas que l'article n'est pas déjà en BDD
 				// car demanderait plus de ressources
 				// car demanderait plus de ressources
 				// La BDD refusera l'ajout de son côté car l'id doit être
 				// La BDD refusera l'ajout de son côté car l'id doit être
 				// unique
 				// unique
 				foreach ($entries as $entry) {
 				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 ();
 						$values = $entry->toArray ();
 						$entryDAO->addEntry ($values);
 						$entryDAO->addEntry ($values);
 					}
 					}

+ 8 - 0
app/models/Entry.php

@@ -439,6 +439,14 @@ class EntryDAO extends Model_pdo {
 	public function listByFeed ($feed, $state, $order = 'high_to_low', $limitFromId = '', $limitCount = '') {
 	public function listByFeed ($feed, $state, $order = 'high_to_low', $limitFromId = '', $limitCount = '') {
 		return $this->listWhere (' WHERE id_feed = ?', $state, $order, $limitFromId, $limitCount, array ($feed));
 		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 () {
 	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';
 		$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';