Nouveau : Datasets open source gratuits disponibles !Decouvrir →
Avance 25 min Laravel

Optimiser les performances Laravel

Pourquoi Optimiser les performances Laravel ?

Dans un monde où la performance est une priorité, le développement web moderne demande aux développeurs de mettre en place des optimisations efficaces pour améliorer l'expérience utilisateur et le temps de réponse de leur application. Un contexte réel est que lorsque votre application est largement utilisée par vos clients ou utilisateurs, chaque milliseconde de latence peut entraîner une baisse significative du taux d'utilisation. Par exemple, un site web qui prend 10 secondes à charger peut voir des taux d'abandon élevés et une perte de confiance des utilisateurs.

Un cas concret d'utilisation est celui d'une application e-commerce. Une latence élevée peut entraîner des clients qui abandonnent rapidement leur panier et qui peuvent ne jamais revenir sur votre site, conduisant à une perte de ventes importantes.

Prerequis

  • Connaissance approfondie de Laravel
    • Modèles Eloquent
    • Contrôleurs
    • Vues Blade
    • Routage
    • Service Providers
    • Middleware
  • Compréhension des concepts de performance web
    • Indexation de bases de données
    • Minification et compression des fichiers
    • Utilisation de caches
  • Connaissance de l'environnement de développement Laravel (Laravel Valet, Homestead)
  • Outils nécessaires :
    • Composer : composer install
    • Node.js : npm install
    • PHP >= 8.0

Concepts fondamentaux

1. Indexation des bases de données

L'indexation des tables peut accélérer considérablement les requêtes SQL. Voici comment créer un index sur une colonne :

// Migration pour ajouter un index sur la colonne 'email' dans la table 'users'
Schema::table('users', function (Blueprint $table) {
    $table->index('email');
});

2. Utilisation de collections Eloquent

Les collections Eloquent offrent des méthodes puissantes pour traiter les données, permettant d'éviter des requêtes N+1 et d'améliorer la performance.

// Utilisation d'une collection Eloquent pour éviter le N+1 query problem
$users = User::with('posts')->get();

foreach ($users as $user) {
    echo $user->name;
}

3. Minification des fichiers CSS et JavaScript

La minification supprime les espaces inutiles et les commentaires dans vos fichiers CSS et JavaScript, réduisant ainsi la taille de ces fichiers et améliorant le temps de chargement.

## Installation de npm packages pour minifier les fichiers CSS et JS
npm install --save-dev gulp

4. Utilisation du cache

Le cache est un mécanisme efficace pour stocker des données temporaires afin d'éviter de recalculer ou de récupérer ces données à chaque requête.

// Stockage en cache d'un résultat de requête
Cache::put('users', User::all(), now()->addMinutes(30));

// Récupération du cache
$users = Cache::get('users');

5. Middleware personnalisé

Les middleware peuvent être utilisés pour effectuer des tâches comme la vérification de l'authentification avant d'exécuter une requête.

// Création d'un middleware personnalisé
php artisan make:middleware CheckRole

// Utilisation du middleware dans un contrôleur
public function __construct()
{
    $this->middleware('check.role');
}

6. Optimisation des images

Les images peuvent être compressées et optimisées pour améliorer le temps de chargement de votre application.

## Installation de ImageOptim pour compresser les images
brew install imageoptim-cli

Mise en pratique : projet fil rouge

Mini-projet : Gestionnaire de tâches (Task Manager)

Étape 1 : Initialisation du projet

composer create-project --prefer-dist laravel/laravel task-manager
cd task-manager
npm install

Étape 2 : Création des modèles et migrations

// Migration pour la table 'tasks'
Schema::create('tasks', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->text('description')->nullable();
    $table->boolean('completed')->default(false);
    $table->timestamps();
});

Étape 3 : Création des contrôleurs

// Contrôleur pour les tâches
php artisan make:controller TaskController --resource

// Définition des méthodes du contrôleur
public function index()
{
    return view('tasks.index', ['tasks' => Task::all()]);
}

public function store(Request $request)
{
    Task::create($request->all());
    return redirect()->route('tasks.index');
}

Étape 4 : Création des vues

<!-- resources/views/tasks/index.blade.php -->
@extends('layouts.app')

@section('content')
<h1>Tâches</h1>
<a href="route('tasks.create')" class="btn btn-primary">Nouvelle Tâche</a>

<table class="table">
    <thead>
        <tr>
            <th>Nom</th>
            <th>Description</th>
            <th>Statut</th>
            <th>Action</th>
        </tr>
    </thead>
    <tbody>
        @foreach ($tasks as $task)
        <tr>
            <td>$task->name</td>
            <td>$task->description</td>
            <td>$task->completed ? 'Terminée' : 'En cours'</td>
            <td>
                <form action="route('tasks.destroy', $task)" method="POST">
                    @csrf
                    @method('DELETE')
                    <button type="submit" class="btn btn-danger">Supprimer</button>
                </form>
            </td>
        </tr>
        @endforeach
    </tbody>
</table>
@endsection

Étape 5 : Configuration des routes

// routes/web.php
Route::resource('tasks', TaskController::class);

Erreurs frequentes et debugging

  1. Erreur : Call to undefined method Illuminate\Database\Query\Builder::whereRaw()

    • Code incorrect :
      $users = User::whereRaw('YEAR(birth_date) = ?', [date('Y')])->get();
      
    • Code correct :
      $users = User::select('*')->from('users')->whereYear('birth_date', date('Y'))->get();
      
  2. Erreur : Undefined variable: task

    • Code incorrect :
      <form action="route('tasks.update', $task->id)" method="POST">
          @csrf
          @method('PUT')
          ...
      </form>
      
    • Code correct :
      <form action="route('tasks.update', $task->id)" method="POST">
          @csrf
          @method('PUT')
          <input type="hidden" name="_method" value="PUT">
          ...
      </form>
      
  3. Erreur : Cannot read property 'length' of undefined

    • Code incorrect :
      <script>
      const tasks = {!! json_encode($tasks) !!};
      tasks.forEach(task => {
          console.log(task.name);
      });
      </script>
      
    • Code correct :
      <script>
      @php
      $tasksJson = json_encode($tasks, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
      echo "const tasks = $tasksJson;";
      @endphp
      
      tasks.forEach(task => {
          console.log(task.name);
      });
      </script>
      

Pour aller plus loin

  1. Utilisation de Laravel Forge pour la mise en production

  2. Optimisation des requêtes Eloquent avec Eloquent Scout

  3. Utilisation de Laravel Telescope pour le débogage et la surveillance de l'application

Défi pratique : Créer une application API RESTful utilisant les concepts appris, avec des fonctionnalités telles que la création, la lecture, la mise à jour et la suppression (CRUD) de ressources.

Besoin d'aide sur Laravel ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quels sont les principaux facteurs à considérer pour optimiser les performances d'une application Laravel?
Les principaux facteurs comprennent l'optimisation des requêtes de base de données, la mise en cache efficace des vues et des données, la réduction du poids des fichiers statiques, et l'utilisation de services tierces comme CDNs pour accélérer le chargement des ressources.
Comment peut-on utiliser le caching dans Laravel pour améliorer les performances?
Laravel propose plusieurs niveaux de caching dont le cache en mémoire, le cache en fichier et le cache Redis. En utilisant ces méthodes, on peut stocker temporairement les résultats des requêtes ou des données qui sont fréquemment accessées, réduisant ainsi les temps d'exécution.
Quelle est l'utilité de la configuration 'queue' dans Laravel et comment optimiser-la?
La configuration 'queue' permet d'effectuer des tâches asynchrones qui pourraient ralentir le rendement principal de l'application. Pour optimiser cette configuration, on peut choisir un driver approprié comme Redis ou Beanstalkd, ajuster les paramètres de la file d'attente et planifier judicieusement les tâches.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.