Module 21 – Laravel en production
Niveau 5 – Laravel expert
Objectifs
Environnements (.env, APP_ENV), logs (canaux, niveaux), config/route/view cache, stockage (local, S3, storage:link). Checklist de déploiement : serveur, PHP, queue worker, cron (ou équivalent Windows), HTTPS.
Théorie
Environnements
La variable APP_ENV (dans .env) définit l’environnement : local, staging, production, etc. Elle influence les messages d’erreur (détails en local, message générique en production), le cache, et les outils (Debugbar en local, pas en prod).
Fichier .env : un par environnement ; jamais versionner .env avec des secrets de prod. Utiliser .env.example comme modèle (sans valeurs sensibles). En production : créer .env sur le serveur, APP_DEBUG=false, APP_ENV=production, clé et BDD réelles.
Détection d’environnement dans le code :
if (app()->environment('production')) { ... }
if (app()->environment(['staging', 'production'])) { ... }
Logs
Laravel utilise Monolog (config config/logging.php). Canal par défaut : souvent stack qui envoie vers plusieurs canaux (ex. single fichier, daily rotation).
Utilisation :
use Illuminate\Support\Facades\Log;
Log::info('User logged in', ['user_id' => $user->id]);
Log::error('Payment failed', ['order_id' => $order->id, 'exception' => $e->getMessage()]);
Log::channel('slack')->critical('Server disk full');
Niveaux : debug, info, notice, warning, error, critical, alert, emergency. En production, mettre le niveau minimum à warning ou error pour éviter des fichiers énormes.
Fichiers de log : storage/logs/laravel.log (ou laravel-YYYY-MM-DD.log pour le canal daily). S’assurer que le serveur web peut écrire dans storage/ et bootstrap/cache/.
Exception handler : dans app/Exceptions/Handler.php, on peut logger les exceptions avec contexte (utilisateur, URL) avant de les renvoyer à l’utilisateur (message générique en prod).
Config, route et view cache
En production, pour de meilleures perfs :
- Config cache :
php artisan config:cache— enregistre toute la config dans un fichier ; les changements de.envne sont plus lus jusqu’àphp artisan config:clear. À utiliser seulement après avoir finalisé la config. - Route cache :
php artisan route:cache— enregistre les routes ; ne pas utiliser si on a des closures dans les routes. Annuler avecroute:clear. - View cache :
php artisan view:cache— compile les templates Blade ; après modification des vues,view:clearpuis éventuellementview:cacheà nouveau.
En développement : ne pas utiliser config/route cache (ou les clear après chaque changement). View cache optionnel.
Filesystem et stockage
Laravel abstrait le stockage avec la facade Storage (config config/filesystem.php). Disques courants : local (storage/app), public (fichiers accessibles en HTTP après php artisan storage:link qui crée un lien symbolique public/storage → storage/app/public), s3 (AWS S3).
Utilisation :
use Illuminate\Support\Facades\Storage;
Storage::disk('public')->put('fichiers/photo.jpg', $contents);
$url = Storage::disk('public')->url('fichiers/photo.jpg');
Storage::delete('fichiers/photo.jpg');
Storage::exists('fichiers/photo.jpg');
Pour les uploads utilisateur : enregistrer dans storage/app/public (ou S3), exposer via storage:link. Ne jamais mettre de fichiers uploadés dans public/ sans contrôle (risque d’exécution de scripts).
Limites : taille max upload (PHP upload_max_filesize, post_max_size), validation côté app (type MIME, extension, taille).
Déploiement (checklist)
- Serveur : PHP 8.1+ (ou 8.2), extensions requises, Nginx ou Apache, MySQL/PostgreSQL ou SQLite.
- Code : cloner le dépôt,
composer install --no-dev --optimize-autoloader, copier.env.exampleen.env, configurer.env(APP_KEY, DB_*, APP_ENV=production, APP_DEBUG=false). - Clé :
php artisan key:generatesi nouvelle app. - Migrations :
php artisan migrate --force. - Cache :
config:cache,route:cache,view:cache(voir ci-dessus). - Queue : lancer un worker (Supervisor recommandé) pour
php artisan queue:work. - Planificateur (tâches planifiées) :
- Linux / macOS : crontab, par ex.
* * * * * cd /chemin/vers/racine/projet && php artisan schedule:run >> /dev/null 2>&1(remplacer/chemin/vers/racine/projetpar la racine de votre projet). - Windows : utiliser le Planificateur de tâches (Task Scheduler) pour exécuter à la même fréquence :
php artisan schedule:run(dossier de travail = racine du projet, PHP dans le PATH).
- Linux / macOS : crontab, par ex.
- Permissions :
storage/etbootstrap/cache/en écriture pour le serveur web. - HTTPS : forcer HTTPS (middleware ou config serveur), cookies sécurisés.
- Monitoring : logs, santé de la queue, espace disque.
Outils : Laravel Forge, Envoyer, Ploi (gestion serveur et déploiement) ; GitHub Actions, GitLab CI pour la CI/CD.
Bonnes pratiques
- APP_DEBUG=false et APP_ENV=production en production ; ne jamais exposer les stack traces.
- Logs : niveau adapté (warning/error en prod), rotation (daily), surveillance des erreurs.
- Cache : config/route/view cache en prod après déploiement ; clear après mise à jour du code si nécessaire.
- Secrets : uniquement dans
.envou gestionnaire de secrets (ex. Vault), jamais dans le code. - Queue worker : redémarrer après chaque déploiement (pour charger le nouveau code) ; utiliser Supervisor pour qu’il reste actif.
Quiz – Module 21
Q1. À quoi sert la variable APP_ENV et que doit-on mettre en production pour APP_DEBUG ?
Q2. Où sont écrits les fichiers de log Laravel par défaut ?
Q3. Quelle commande met en cache la configuration ? Pourquoi ne pas l’utiliser en développement ?
Q4. À quoi sert php artisan storage:link ?
Q5. Pourquoi faut-il redémarrer le worker de queue après un déploiement ?
Réponses
R1. APP_ENV définit l’environnement (local, production, etc.) et influence le comportement de l’app. En production on met APP_DEBUG=false pour ne pas afficher les détails d’erreurs aux utilisateurs.
R2. Dans storage/logs/ (fichier laravel.log ou laravel-YYYY-MM-DD.log selon la config).
R3. php artisan config:cache. En dev, les changements de .env ne seraient pas pris en compte tant qu’on ne fait pas config:clear ; on évite donc la config cache pour garder la réactivité.
R4. À créer un lien symbolique public/storage → storage/app/public pour que les fichiers stockés dans storage/app/public soient accessibles par URL publique.
R5. Parce que le worker charge le code PHP en mémoire au démarrage ; sans redémarrage, il continuerait à exécuter l’ancienne version du code après un déploiement.
Suite
Module 22 – Laravel & écosystème (Inertia, Livewire, Vue.js, API Platform, multi-tenant).