Archi perf : ne pas charger le contenu Markdown dans getAll() #24
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problème
Dans
ArticleManager::loadArticle(), le contenu Markdown (index.md) est lu et chargé dans le tableau pour chaque article, même quand seules les métadonnées sont nécessaires (page liste, slug lookup, unicité de slug).Sur un blog avec 50 articles de 5 Ko chacun,
getAll()lit 250 Ko de Markdown inutilement à chaque chargement de la page d'accueil.Solution proposée
Introduire un paramètre
$withContent = falsedansloadArticle()etgetAll():Seuls
getByUuid()etgetBySlug()(appelés depuis la vue article ou l'édition) ont besoin du contenu. La liste et les lookups de slug n'en ont pas besoin.Impact
index.mdindex.mdindex.mdindex.md(inchangé)uniqueSlug()viagetAll()index.mdindex.mdCritères d'acceptation
getAll()ne lit plusindex.mdpar défautgetBySlug()etgetByUuid()passentwithContent: trueou font une lecture cibléeNote
Ce ticket est indépendant du ticket #26 (cache de la liste) mais les deux se complètent : le cache évite les scans répétés entre requêtes, ce ticket réduit le coût de chaque scan.
Migré depuis varlog#35
Analyse : plus complexe que prévu.
getAll()est consommée par 3 templates qui rendent le contenu Markdown complet :post_list.php(excerpt),author_articles.phpetauthor_profile.php(rendu intégral). RetirercontentdegetAll()casse ces trois pages sans un refactoring complet.Pré-requis pour implémenter ce ticket :
featuredausearch_index.json(actuellement absent).author_articles.phpetauthor_profile.phppour charger le contenu viagetByUuid()article par article.post_list.phppour utiliser le champplaindu search_index comme excerpt.index.phppour préférergetSearchIndex()àgetAll().Le ticket #24 reste ouvert — la valeur est réelle mais le coût est plus élevé que prévu.
Implémenté :
loadArticle(string $dir, bool $withContent = true)— quandfalse, lit uniquementmeta.json, sans cache articleloadAll()appelleloadArticle($dir, false)puis enrichit chaque article du champplaindepuissearch_index.json(1 seule lecture JSON)rebuildSearchIndex()litindex.mddirectement par UUID — plus de dépendance à$article['content']dans getAll()search_index.jsonreçoit le champfeatured;getSearchIndex()déclenche un rebuild si absentpost_list.php,author_articles.php,author_profile.php: excerpts via$post['plain']— Parsedown supprimé de ces templatesRésultat :
getAll()lit Nmeta.json+ 1search_index.jsonau lieu de N caches article (qui incluaient le contenu).