Perf : mettre en cache la liste des articles (getAll) #16

Closed
opened 2026-05-13 22:09:29 +00:00 by cedricAbonnel · 0 comments
Owner

Problème

ArticleManager::getAll() parcourt le système de fichiers à chaque requête : scandir() + lecture de chaque meta.json + json_decode() pour tous les articles. Cette fonction est appelée plusieurs fois par requête (liste, getBySlug(), uniqueSlug()), ce qui multiplie les lectures disque inutiles et deviendra un vrai goulot au-delà de quelques dizaines d'articles.

Localisation

  • src/ArticleManager.phpgetAll() (ligne 15), getBySlug() (ligne 47), uniqueSlug() (ligne 296)

Solution proposée

Cache fichier JSON

Générer un fichier data/_cache/articles.json contenant le tableau des métadonnées de tous les articles (sans le contenu Markdown). Ce cache est :

  • Invalidé à chaque create(), update(), delete()
  • Lu par getAll() en lieu et place du scan complet
// Lecture
if (file_exists($cachePath) && filemtime($cachePath) > $newestMeta) {
    return json_decode(file_get_contents($cachePath), true);
}
// Écriture après scan
file_put_contents($cachePath, json_encode($articles));

Bénéfice secondaire

getBySlug() et uniqueSlug() héritent automatiquement du cache via getAll().

Critères d'acceptation

  • getAll() lit le cache si disponible et valide
  • Le cache est invalidé après chaque écriture (create, update, delete)
  • Le cache ne contient pas le contenu Markdown (uniquement les métadonnées)
  • Le répertoire data/_cache/ est exclu du rsync de contenu (push-data.sh)
  • Aucune régression sur la liste et la vue article

Migré depuis varlog#26

## Problème `ArticleManager::getAll()` parcourt le système de fichiers à chaque requête : `scandir()` + lecture de chaque `meta.json` + `json_decode()` pour **tous** les articles. Cette fonction est appelée plusieurs fois par requête (liste, `getBySlug()`, `uniqueSlug()`), ce qui multiplie les lectures disque inutiles et deviendra un vrai goulot au-delà de quelques dizaines d'articles. ## Localisation - `src/ArticleManager.php` — `getAll()` (ligne 15), `getBySlug()` (ligne 47), `uniqueSlug()` (ligne 296) ## Solution proposée ### Cache fichier JSON Générer un fichier `data/_cache/articles.json` contenant le tableau des métadonnées de tous les articles (sans le contenu Markdown). Ce cache est : - **Invalidé** à chaque `create()`, `update()`, `delete()` - **Lu** par `getAll()` en lieu et place du scan complet ```php // Lecture if (file_exists($cachePath) && filemtime($cachePath) > $newestMeta) { return json_decode(file_get_contents($cachePath), true); } // Écriture après scan file_put_contents($cachePath, json_encode($articles)); ``` ### Bénéfice secondaire `getBySlug()` et `uniqueSlug()` héritent automatiquement du cache via `getAll()`. ## Critères d'acceptation - [ ] `getAll()` lit le cache si disponible et valide - [ ] Le cache est invalidé après chaque écriture (`create`, `update`, `delete`) - [ ] Le cache ne contient pas le contenu Markdown (uniquement les métadonnées) - [ ] Le répertoire `data/_cache/` est exclu du rsync de contenu (`push-data.sh`) - [ ] Aucune régression sur la liste et la vue article --- *Migré depuis [varlog#26](https://git.abonnel.fr/cedricAbonnel/varlog/issues/26)*
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#16