Comment installer Composer

Comment installer Composer
Réponse rapide

Téléchargez l'installateur, comparez son empreinte SHA-384 à celle publiée sur composer.github.io/installer.sig, puis exécutez-le vers /usr/local/bin/composer. Versionnez composer.lock, ignorez vendor/. En production, composer install --no-dev --optimize-autoloader, jamais composer update et jamais sudo.

Composer est le gestionnaire de dépendances de PHP. Il installe les bibliothèques dont un projet a besoin, résout leurs propres dépendances, verrouille les versions et génère l’autochargement des classes. Ce tutoriel couvre l’installation sur les trois systèmes, les commandes du quotidien et les erreurs qui coûtent du temps. Vérifié avec Composer 2.10.3 sur PHP 8.5.10.

Installer, en vérifiant la signature

La recette qu’on voit partout est curl -sS https://getcomposer.org/installer | php. Elle exécute directement un fichier téléchargé, sans rien vérifier. La procédure officielle compare l’empreinte SHA-384 du script à celle publiée par le projet avant de le lancer.

installer-composer.sh
#!/usr/bin/env bash
set -euo pipefail

ATTENDU=$(curl -sS https://composer.github.io/installer.sig)
curl -sS https://getcomposer.org/installer -o composer-setup.php
CALCULE=$(php -r "echo hash_file('sha384', 'composer-setup.php');")

if [ "$ATTENDU" != "$CALCULE" ]; then
    >&2 echo 'ERREUR : signature invalide, ne pas exécuter'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php
composer --version
code
Composer version 2.10.3 2026-08-27 13:34:23

Les deux empreintes concordent, l’installateur est authentique. C’est trente secondes de travail supplémentaire contre l’exécution d’un script arbitraire avec les droits de votre compte.

Windows

Télécharger et exécuter Composer-Setup.exe. L’installateur détecte PHP, configure le PATH et se met à jour tout seul.

macOS

Le script ci-dessus fonctionne tel quel. Avec Homebrew :

bash
brew install composer

Une précision sur les tutoriels plus anciens : ils demandent d’ajouter un alias dans ~/.bash_profile. Depuis macOS Catalina (2019), le shell par défaut est zsh, et ce fichier n’est plus lu. Le fichier à modifier est ~/.zshrc. Et l’alias n’est de toute façon pas nécessaire si composer.phar est installé dans /usr/local/bin/composer avec le droit d’exécution.

Linux

bash
sudo apt-get update
sudo apt-get install -y php-cli unzip curl
# puis le script de vérification ci-dessus

Le paquet composer des dépôts Debian et Ubuntu est souvent en retard de plusieurs versions. Mieux vaut l’installateur officiel.

Démarrer un projet

bash
mkdir mon-projet && cd mon-projet
composer init          # questionnaire interactif
composer require monolog/monolog

Cette commande crée ou met à jour trois choses :

  • composer.json, ce que vous demandez. Se versionne.
  • composer.lock, les versions exactes installées, au commit près. Se versionne aussi, c’est ce qui garantit que toute l’équipe et la production ont le même code.
  • vendor/, les fichiers téléchargés. Ne se versionne pas, à mettre dans .gitignore.
.gitignore
/vendor/

install ou update : la distinction qui compte

Commande Ce qu’elle fait Où l’utiliser
composer install Installe exactement ce que dit composer.lock Production, intégration continue, arrivée dans l’équipe
composer update Cherche des versions plus récentes et réécrit composer.lock Poste de développement, jamais en production

Lancer composer update sur un serveur de production installe des versions que personne n’a testées. C’est la cause d’un nombre remarquable de mises en production ratées.

bash
# Mettre à jour un seul paquet
composer update monolog/monolog

# Mettre à jour un paquet et ses dépendances
composer update monolog/monolog --with-dependencies

# Voir ce qui changerait, sans rien changer
composer update --dry-run

Les contraintes de version

composer.json
{
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.5",
        "symfony/console": "~6.4.0",
        "vendor/paquet": "2.1.3"
    }
}
Écriture Autorise Refuse
^3.5 3.5, 3.6, 3.99 4.0
~6.4.0 6.4.0, 6.4.9 6.5.0
6.4.* 6.4.0 à 6.4.99 6.5.0
2.1.3 2.1.3 uniquement tout le reste

Le ^ est le bon choix par défaut : il autorise les corrections et les ajouts, refuse les ruptures de compatibilité. Figer une version exacte semble prudent mais bloque les correctifs de sécurité.

Déclarer la version de PHP dans require évite d’installer un paquet qui ne tournera pas sur le serveur. Et si la machine de développement n’a pas la même version que la production, config.platform fait résoudre les dépendances pour la version cible :

json
{
    "config": {
        "platform": {
            "php": "8.4.0"
        }
    }
}

L’autochargement

C’est la fonction la plus utile de Composer et celle qu’on découvre en dernier. La norme PSR-4 associe un préfixe d’espace de noms à un dossier.

composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "App\\Tests\\": "tests/"
        },
        "files": [
            "src/fonctions.php"
        ]
    }
}

Les antislashs se doublent dans un fichier JSON. C’est l’erreur la plus fréquente sur ce fichier, et elle est silencieuse jusqu’au moment où Composer refuse de lire le fichier :

code
"App\": "src/"     -> JSON INVALIDE (l'antislash échappe le guillemet)
"App\\": "src/"    -> correct

Avec cette configuration, la classe App\Personnages\Guerrier est cherchée dans src/Personnages/Guerrier.php. Le chemin découle du nom, avec des antislashs dans le code et des barres obliques dans les dossiers.

src/Personnages/Guerrier.php
<?php

declare(strict_types=1);

namespace App\Personnages;   // antislashs, jamais de barres obliques

final class Guerrier
{
    // …
}
index.php
<?php

require __DIR__ . '/vendor/autoload.php';

use App\Personnages\Guerrier;

$conan = new Guerrier();

Après toute modification de la section autoload :

bash
composer dump-autoload

Pas de commentaires dans composer.json

JSON n’a pas de commentaires. Un // glissé dans le fichier le rend illisible :

code
In JsonFile.php line 398:
  "./composer.json" does not contain valid JSON
  Lexical error on line 5. Comments are not allowed.

La commande composer validate vérifie le fichier avant que le problème n’apparaisse ailleurs.

Vérifier les vulnérabilités

composer audit confronte les paquets installés à la base d’avis de sécurité de l’écosystème PHP.

bash
composer audit
code
No security vulnerability advisories found.

C’est une commande à placer dans l’intégration continue, après composer install : sans dossier vendor/, elle répond seulement « No installed packages found ». Elle renvoie un code de sortie non nul quand un avis concerne le projet.

Repérer les paquets abandonnés

Composer signale les paquets dont l’auteur a déclaré l’abandon, au moment de l’installation. L’avertissement passe souvent inaperçu dans le flot de la sortie :

code
Package facebook/php-sdk is abandoned, you should avoid using it.
Use facebook/graph-sdk instead.

Un paquet abandonné ne reçoit plus de correctif, y compris de sécurité. Ce message mérite qu’on s’arrête dessus plutôt que de le laisser défiler.

Déployer en production

bash
composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist
Option Effet
--no-dev N’installe pas les outils de développement (tests, analyse statique)
--optimize-autoloader Génère une table de correspondance complète, sans recherche disque à l’exécution
--no-interaction Ne pose aucune question
--prefer-dist Télécharge les archives plutôt que de cloner les dépôts

Et une règle qui vaut d’être répétée : ne jamais lancer Composer avec sudo. Les fichiers de vendor/ appartiendraient à root, le serveur web ne pourrait plus les lire, et le cache de Composer se retrouverait dans /root/.composer. Si l’installation globale demande sudo, c’est seulement pour écrire dans /usr/local/bin, une fois.

Les commandes du quotidien

bash
# Ce qui est installé
composer show
composer show monolog/monolog        # détail d'un paquet
composer show --tree                 # arborescence des dépendances

# Ce qui pourrait être mis à jour
composer outdated
composer outdated --direct           # seulement vos dépendances directes

# Pourquoi ce paquet est-il là ?
composer why psr/log
composer why-not symfony/console 7.0 # ce qui bloque une montée de version

# Retirer un paquet
composer remove monolog/monolog

# Réparer une installation douteuse
rm -rf vendor composer.lock && composer install

Deux drapeaux de Composer 1 traînent encore dans les tutoriels. composer show -i renvoie désormais un avertissement, puisque les paquets installés sont l’affichage par défaut :

code
You are using the deprecated option "installed". Only installed packages are
shown by default now. The --all option can be used to show all packages.

Et composer --V n’existe pas, c’est -V ou --version :

code
The "--V" option does not exist.

Sources de paquets particulières

json
{
    "require": {
        "moi/mon-paquet": "dev-main"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/moi/mon-paquet"
        }
    ]
}

Pour développer un paquet en parallèle du projet qui l’utilise, le dépôt de type path crée un lien symbolique : les modifications sont visibles immédiatement, sans réinstallation.

json
{
    "repositories": [
        {
            "type": "path",
            "url": "../mes-paquets/mon-paquet",
            "options": {
                "symlink": true
            }
        }
    ]
}

Les scripts

json
{
    "scripts": {
        "test": "phpunit",
        "analyse": "phpstan analyse src --level=8",
        "verifier": [
            "@analyse",
            "@test"
        ]
    }
}
bash
composer verifier

Cela évite de retenir les chemins vers vendor/bin et donne à toute l’équipe les mêmes commandes.

À retenir

  • Vérifier l’empreinte de l’installateur avant de l’exécuter.
  • Versionner composer.lock, ignorer vendor/.
  • install en production, update seulement en développement.
  • Doubler les antislashs dans composer.json, aucun commentaire.
  • composer audit dans l’intégration continue, jamais de sudo.

Composer est la porte d’entrée de la plupart des bibliothèques : PHPMailer pour envoyer un e-mail et Ratchet pour un serveur WebSocket s’installent tous deux avec composer require.

Pour la suite : les bonnes pratiques Composer, les bases de la POO en PHP pour tirer parti de l’autochargement, et le hub Développement web.

Erreurs fréquentes

Installateur exécuté sans vérification curl … | php exécute un fichier téléchargé sans contrôle. La procédure officielle compare son empreinte SHA-384 avant de le lancer.
Antislash simple dans composer.json "App": "src/" est un JSON invalide : l'antislash échappe le guillemet. Il en faut deux.
Commentaire dans composer.json Lexical error on line 5. Comments are not allowed. JSON n'accepte pas les commentaires.
composer update en production Installe des versions que personne n'a testées. En production c'est composer install, qui suit composer.lock.
Composer lancé avec sudo Les fichiers de vendor/ appartiennent alors à root et le serveur web ne peut plus les lire.
composer --V et composer show -i The "--V" option does not exist. et You are using the deprecated option "installed". Ces drapeaux viennent de Composer 1.
~/.bash_profile sur macOS Le shell par défaut est zsh depuis macOS Catalina : ce fichier n'est plus lu, c'est ~/.zshrc.

ComposerDépendancesPHP

Damien Flandrin Développeur web depuis 2010, créateur de Gekkode et d’Email Impact. Chaque article est testé sur un projet réel avant publication. Contact
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.