Aller au contenu

Performance & Cache

ArtisanCMS implemente une strategie d’optimisation a plusieurs niveaux : cache applicatif, traitement d’images, requetes base de donnees, traitement asynchrone et compilation frontend.

Chaque composant dispose de sa propre duree de vie en cache, configurable dans config/cms.php :

'cache' => [
'settings' => 3600, // 1 heure
'pages' => 600, // 10 minutes
'menus' => 1800, // 30 minutes
'themes' => 3600, // 1 heure
'plugins' => 3600, // 1 heure
'blocks' => 1800, // 30 minutes
'taxonomies' => 1800, // 30 minutes
],
EnvironnementPiloteRaison
DeveloppementfileAucune dependance externe
ProductionredisHaute performance, partage entre workers

ArtisanCMS utilise 10 observers Eloquent pour invalider le cache lorsqu’une ressource est modifiee :

class PageObserver
{
public function saved(Page $page): void
{
Cache::forget("page.{$page->slug}");
Cache::forget('pages.sitemap');
}
public function deleted(Page $page): void
{
Cache::forget("page.{$page->slug}");
Cache::forget('pages.sitemap');
}
}

Les observers couvrent : Page, Post, Menu, Setting, Taxonomy, Theme, Plugin, Block, Media et Navigation.

Fenêtre de terminal
php artisan cms:cache-clear # Cache specifique ArtisanCMS
php artisan cache:clear # Tout le cache Laravel

Chaque image uploadee est convertie en WebP (reduction de 25-35%) et declinee en variantes responsives :

'responsive_sizes' => [320, 640, 768, 1024, 1280, 1536, 1920],

Le rendu HTML utilise srcset pour charger uniquement la taille adaptee :

<img
src="/storage/media/photo-1024.webp"
srcset="/storage/media/photo-320.webp 320w,
/storage/media/photo-640.webp 640w,
/storage/media/photo-1024.webp 1024w,
/storage/media/photo-1920.webp 1920w"
sizes="(max-width: 768px) 100vw, 50vw"
loading="lazy"
/>

Une miniature 300x300 pixels est generee pour la mediatheque et les listes admin.

Les migrations creent des index sur toutes les cles etrangeres et colonnes frequemment filtrees. Les controleurs utilisent le eager loading pour eviter le probleme N+1 :

$pages = Page::with(['author', 'taxonomies', 'media'])
->published()
->paginate(20);

Les operations couteuses sont traitees en arriere-plan via les queues Laravel :

  • Webhooks : envoi sans bloquer la requete utilisateur.
  • Analytics : agregation par job planifie.
  • Images : generation des variantes responsives differee.
dispatch(new SendWebhookJob($webhook, $payload));

L’interface admin charge uniquement le code necessaire a chaque page :

const PageEditor = lazy(() => import('./Pages/PageEditor'));
const MediaLibrary = lazy(() => import('./Pages/MediaLibrary'));
const Settings = lazy(() => import('./Pages/Settings'));

La compilation utilise Vite avec tree-shaking, minification, code splitting automatique et compression optionnelle gzip/brotli.

Le monorepo utilise Turborepo pour le cache de build. Les builds incrementaux reutilisent les resultats precedents lorsque le code n’a pas change :

Fenêtre de terminal
npx turbo run build

En production, activez les caches natifs :

Fenêtre de terminal
php artisan config:cache # Fusionne les fichiers de configuration
php artisan route:cache # Serialise la table de routage
php artisan view:cache # Precompile les templates Blade
php artisan optimize # Tout en une commande