Optimisation Performance Symfony 2024 : Guide Complet
En tant que développeur fullstack avec plus de 8 ans d’expérience, j’ai optimisé de nombreuses applications Symfony pour des performances maximales. Voici mon guide complet des meilleures pratiques 2024.
1. Configuration OPcache pour Symfony
L’OPcache est crucial pour les performances PHP. Voici ma configuration recommandée :
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=12
opcache.max_accelerated_files=60000
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=0
2. Optimisation du Cache Symfony
Cache APCu pour les Métadonnées
# config/packages/cache.yaml
framework:
cache:
default_redis_provider: redis://localhost:6379
pools:
cache.app:
adapter: cache.adapter.redis
cache.system:
adapter: cache.adapter.apcu
Cache Doctrine
# config/packages/doctrine.yaml
doctrine:
orm:
metadata_cache_driver:
type: apcu
query_cache_driver:
type: redis
host: localhost
port: 6379
result_cache_driver:
type: redis
host: localhost
port: 6379
3. Optimisation Doctrine ORM
Utilisation des Query Builders Optimisés
// ❌ Mauvais : N+1 problème
public function findPostsWithAuthors(): array
{
return $this->createQueryBuilder('p')
->getQuery()
->getResult();
}
// ✅ Bon : Utilisation de JOIN
public function findPostsWithAuthors(): array
{
return $this->createQueryBuilder('p')
->leftJoin('p.author', 'a')
->addSelect('a')
->getQuery()
->getResult();
}
Pagination Efficace
use Doctrine\ORM\Tools\Pagination\Paginator;
public function findPaginatedPosts(int $page, int $limit): Paginator
{
$query = $this->createQueryBuilder('p')
->orderBy('p.createdAt', 'DESC')
->setFirstResult(($page - 1) * $limit)
->setMaxResults($limit)
->getQuery();
return new Paginator($query);
}
4. Optimisation des Assets avec Webpack Encore
// webpack.config.js
const Encore = require('@symfony/webpack-encore');
Encore
.setOutputPath('public/build/')
.setPublicPath('/build')
.addEntry('app', './assets/app.js')
.splitEntryChunks()
.enableSingleRuntimeChunk()
.cleanupOutputBeforeBuild()
.enableBuildNotifications()
.enableSourceMaps(!Encore.isProduction())
.enableVersioning(Encore.isProduction())
.enableSassLoader()
.enablePostCssLoader();
if (Encore.isProduction()) {
Encore.enableIntegrityHashes();
}
module.exports = Encore.getWebpackConfig();
5. Profiling et Monitoring
Utilisation du Symfony Profiler
// src/Controller/ApiController.php
use Symfony\Component\Stopwatch\Stopwatch;
class ApiController extends AbstractController
{
public function expensiveOperation(Stopwatch $stopwatch): Response
{
$stopwatch->start('expensive-operation');
// Votre code coûteux ici
$stopwatch->stop('expensive-operation');
return $this->json(['status' => 'success']);
}
}
Monitoring avec Blackfire
# Installation
composer require --dev blackfire/php-sdk
# Configuration
blackfire curl http://your-app.local/api/endpoint
6. Optimisation Base de Données
Index Stratégiques
-- Index composite pour les requêtes fréquentes
CREATE INDEX idx_posts_status_date ON posts (status, created_at);
-- Index partiel pour les données actives
CREATE INDEX idx_active_users ON users (email) WHERE active = true;
Configuration MySQL/MariaDB
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_type = 1
query_cache_size = 128M
7. CDN et Optimisation Frontend
Configuration CloudFront
# config/packages/framework.yaml
framework:
assets:
base_urls:
- 'https://d1234567890.cloudfront.net'
Optimisation Images
// src/Service/ImageOptimizerService.php
use Intervention\Image\ImageManagerStatic as Image;
class ImageOptimizerService
{
public function optimize(string $path, int $quality = 85): void
{
$image = Image::make($path);
if ($image->width() > 1920) {
$image->resize(1920, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
}
$image->save($path, $quality);
}
}
8. Configuration Production
Variables d’Environnement
# .env.local
APP_ENV=prod
APP_DEBUG=0
DATABASE_URL=mysql://user:pass@127.0.0.1:3306/dbname?serverVersion=8.0
REDIS_URL=redis://localhost:6379
MAILER_DSN=smtp://localhost
Cache Warmup
# Script de déploiement
php bin/console cache:clear --env=prod --no-debug
php bin/console cache:warmup --env=prod
php bin/console doctrine:schema:validate
Résultats de Performance
Avec ces optimisations, mes applications Symfony atteignent :
- Temps de réponse : < 100ms pour 95% des requêtes
- Throughput : > 1000 req/sec sur un serveur standard
- Consommation mémoire : < 32MB par requête
- Score PageSpeed : > 95/100
Conclusion
L’optimisation Symfony 2024 nécessite une approche holistique : OPcache, cache applicatif, optimisation base de données, et monitoring continu. Ces techniques vous permettront d’obtenir des performances exceptionnelles.
Besoin d’aide pour optimiser votre application Symfony ? Contactez-moi pour un audit de performance gratuit.
Mathieu Mont - Développeur Fullstack spécialisé PHP Symfony, Vue.js, React