Perf : mettre en cache le rendu Markdown des articles #17

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

Problème

À chaque vue d'article, Parsedown::text() reparse le Markdown complet depuis le fichier disque. Pour des articles longs, ce traitement est inutilement répété à chaque requête alors que le contenu source ne change pas.

Localisation

  • templates/post_view.php — lignes 2-3 (instanciation Parsedown + appel text())
  • public/index.phpcase 'view' : lecture du fichier + resolveFileUrls()

Solution proposée

Stockage du HTML rendu dans data/<uuid>/_cache/content.html, invalidé dès que index.md est modifié.

$cacheFile = $dataDir . / . $uuid . /_cache/content.html;
$mdFile    = $dataDir . / . $uuid . /index.md;

if (file_exists($cacheFile) && filemtime($cacheFile) >= filemtime($mdFile)) {
    $renderedContent = file_get_contents($cacheFile);
} else {
    $renderedContent = $Parsedown->text($rawContent);
    file_put_contents($cacheFile, $renderedContent);
}

La logique de cache peut être encapsulée dans ArticleManager::getRenderedContent(string $uuid): string.

Critères d'acceptation

  • Le HTML rendu est mis en cache dans data/<uuid>/_cache/content.html
  • Le cache est invalidé dès que index.md est plus récent (comparaison filemtime)
  • update() invalide explicitement le cache HTML de l'article modifié
  • Les fichiers _cache/ sont exclus du rsync de contenu
  • Aucune régression sur le rendu (images, liens, blocs code)

Dépendance

  • Liée au ticket #25 (guillemets courbes) : si une transformation post-Parsedown est ajoutée, elle doit aussi être incluse dans le HTML mis en cache

Migré depuis varlog#27

## Problème À chaque vue d'article, `Parsedown::text()` reparse le Markdown complet depuis le fichier disque. Pour des articles longs, ce traitement est inutilement répété à chaque requête alors que le contenu source ne change pas. ## Localisation - `templates/post_view.php` — lignes 2-3 (instanciation Parsedown + appel `text()`) - `public/index.php` — `case 'view'` : lecture du fichier + `resolveFileUrls()` ## Solution proposée Stockage du HTML rendu dans `data/<uuid>/_cache/content.html`, invalidé dès que `index.md` est modifié. ```php $cacheFile = $dataDir . / . $uuid . /_cache/content.html; $mdFile = $dataDir . / . $uuid . /index.md; if (file_exists($cacheFile) && filemtime($cacheFile) >= filemtime($mdFile)) { $renderedContent = file_get_contents($cacheFile); } else { $renderedContent = $Parsedown->text($rawContent); file_put_contents($cacheFile, $renderedContent); } ``` La logique de cache peut être encapsulée dans `ArticleManager::getRenderedContent(string $uuid): string`. ## Critères d'acceptation - [ ] Le HTML rendu est mis en cache dans `data/<uuid>/_cache/content.html` - [ ] Le cache est invalidé dès que `index.md` est plus récent (comparaison `filemtime`) - [ ] `update()` invalide explicitement le cache HTML de l'article modifié - [ ] Les fichiers `_cache/` sont exclus du rsync de contenu - [ ] Aucune régression sur le rendu (images, liens, blocs code) ## Dépendance - Liée au ticket #25 (guillemets courbes) : si une transformation post-Parsedown est ajoutée, elle doit aussi être incluse dans le HTML mis en cache --- *Migré depuis [varlog#27](https://git.abonnel.fr/cedricAbonnel/varlog/issues/27)*
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#17