diff options
| author | 2013-11-05 18:37:41 +0100 | |
|---|---|---|
| committer | 2013-11-05 18:37:41 +0100 | |
| commit | fdb2b7588e2326dc36823d7fac5f88ff8ebee2ec (patch) | |
| tree | 5b0e7de61a71ce785ac41f198e76c38de9d793ef | |
| parent | fb0c0868a44ee10a43703c27f18aa6fcde0f4211 (diff) | |
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.
| -rwxr-xr-x | app/controllers/feedController.php | 8 | ||||
| -rwxr-xr-x | app/models/Entry.php | 8 |
2 files changed, 14 insertions, 2 deletions
diff --git a/app/controllers/feedController.php b/app/controllers/feedController.php index 1131c3a7a..f14ed7997 100755 --- a/app/controllers/feedController.php +++ b/app/controllers/feedController.php @@ -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); } diff --git a/app/models/Entry.php b/app/models/Entry.php index 2829a3586..e835f9aed 100755 --- a/app/models/Entry.php +++ b/app/models/Entry.php @@ -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'; |
