
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.
#!/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 --versionComposer version 2.10.3 2026-08-27 13:34:23Les 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 :
brew install composerUne 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
sudo apt-get update
sudo apt-get install -y php-cli unzip curl
# puis le script de vérification ci-dessusLe 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
mkdir mon-projet && cd mon-projet
composer init # questionnaire interactif
composer require monolog/monologCette 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.
/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.
# 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-runLes contraintes de version
{
"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 :
{
"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.
{
"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 :
"App\": "src/" -> JSON INVALIDE (l'antislash échappe le guillemet)
"App\\": "src/" -> correctAvec 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.
<?php
declare(strict_types=1);
namespace App\Personnages; // antislashs, jamais de barres obliques
final class Guerrier
{
// …
}<?php
require __DIR__ . '/vendor/autoload.php';
use App\Personnages\Guerrier;
$conan = new Guerrier();Après toute modification de la section autoload :
composer dump-autoloadPas de commentaires dans composer.json
JSON n’a pas de commentaires. Un // glissé dans le fichier le rend illisible :
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.
composer auditNo 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 :
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
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
# 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 installDeux 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 :
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 :
The "--V" option does not exist.Sources de paquets particulières
{
"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.
{
"repositories": [
{
"type": "path",
"url": "../mes-paquets/mon-paquet",
"options": {
"symlink": true
}
}
]
}Les scripts
{
"scripts": {
"test": "phpunit",
"analyse": "phpstan analyse src --level=8",
"verifier": [
"@analyse",
"@test"
]
}
}composer verifierCela é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, ignorervendor/. installen production,updateseulement en développement.- Doubler les antislashs dans
composer.json, aucun commentaire. composer auditdans l’intégration continue, jamais desudo.
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
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."App": "src/" est un JSON invalide : l'antislash échappe le guillemet. Il en faut deux.Lexical error on line 5. Comments are not allowed. JSON n'accepte pas les commentaires.composer install, qui suit composer.lock.vendor/ appartiennent alors à root et le serveur web ne peut plus les lire.The "--V" option does not exist. et You are using the deprecated option "installed". Ces drapeaux viennent de Composer 1.~/.zshrc.

