Aller au contenu principal

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 .env ne 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 avec route:clear.
  • View cache : php artisan view:cache — compile les templates Blade ; après modification des vues, view:clear puis éventuellement view: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/storagestorage/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)

  1. Serveur : PHP 8.1+ (ou 8.2), extensions requises, Nginx ou Apache, MySQL/PostgreSQL ou SQLite.
  2. Code : cloner le dépôt, composer install --no-dev --optimize-autoloader, copier .env.example en .env, configurer .env (APP_KEY, DB_*, APP_ENV=production, APP_DEBUG=false).
  3. Clé : php artisan key:generate si nouvelle app.
  4. Migrations : php artisan migrate --force.
  5. Cache : config:cache, route:cache, view:cache (voir ci-dessus).
  6. Queue : lancer un worker (Supervisor recommandé) pour php artisan queue:work.
  7. 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/projet par 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).
  8. Permissions : storage/ et bootstrap/cache/ en écriture pour le serveur web.
  9. HTTPS : forcer HTTPS (middleware ou config serveur), cookies sécurisés.
  10. 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

  1. APP_DEBUG=false et APP_ENV=production en production ; ne jamais exposer les stack traces.
  2. Logs : niveau adapté (warning/error en prod), rotation (daily), surveillance des erreurs.
  3. Cache : config/route/view cache en prod après déploiement ; clear après mise à jour du code si nécessaire.
  4. Secrets : uniquement dans .env ou gestionnaire de secrets (ex. Vault), jamais dans le code.
  5. 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/storagestorage/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).