PHP Composer

Dependency management, autoloading, lock files, and common commands.

Beginner
Key PointsCommit `composer.lock`; never commit `vendor/`.

Installing

Bash
# Linux / macOS
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# Windows:下载 Composer-Setup.exe

composer --version

composer.json

JSON
{
    "name": "demo/app",
    "description": "示例项目",
    "type": "project",
    "require": {
        "php": ">=8.1",
        "monolog/monolog": "^3.0",
        "guzzlehttp/guzzle": "^7.8"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "config": {
        "sort-packages": true
    },
    "scripts": {
        "test": "phpunit"
    }
}

^3.0 means >= 3.0 and < 4.0. ~3.1 means >= 3.1 and < 4.0. 3.1.* means >= 3.1 and < 3.2.

ConstraintRange
^1.2.3>= 1.2.3 < 2.0.0
~1.2.3>= 1.2.3 < 1.3.0
~1.2>= 1.2 < 2.0
1.2.*>= 1.2.0 < 1.3.0
>=1.0 <2.0显式区间

Common commands

Bash
composer install          # 按 lock 文件安装(生产环境用这个)
composer update           # 按 json 更新并重写 lock
composer require 包名      # 加依赖
composer remove 包名       # 删依赖
composer dump-autoload    # 重建自动加载
composer outdated         # 列出可升级的包
composer audit            # 检查已知漏洞
composer show 包名         # 查看包信息
**Deploy with composer install, never update.** install follows composer.lock exactly; update may pull incompatible versions.

Autoloading

PHP
<?php
require __DIR__ . "/vendor/autoload.php";

use App\Services\Greeter;

$g = new Greeter();
echo $g->hello("Tom"), "\n";

echo class_exists("App\\Services\\Greeter") ? "类已加载" : "类不存在", "\n";

App\Services\Greeter maps to src/Services/Greeter.php. That is PSR-4: prefix to directory, remainder to path.

Output
你好,Tom
类已加载

Lock file and deployment

FileCommitWhy
composer.json是依赖声明
composer.lock是锁定确切版本,保证环境一致
vendor/否体积大,可随时重建
.env否含密钥
Library packages should not commit composer.lock — they must test against many versions. Applications must commit it.

Production

Bash
composer install --no-dev --optimize-autoloader --no-interaction

# --no-dev               不装 require-dev
# --optimize-autoloader  生成 classmap,加载更快
# --no-interaction       不询问,适合 CI

--optimize-autoloader (-o) bakes a class-to-file map, skipping runtime path resolution. Always use it in production.

Private repositories

JSON
{
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:myorg/private-package.git"
        }
    ],
    "config": {
        "github-oauth": {
            "github.com": "ghp_xxxxxxxx"
        }
    }
}
**Never put tokens in composer.json** — it lands in Git. Use composer config --global or the COMPOSER_AUTH environment variable.

Troubleshooting

ProblemFix
内存不足COMPOSER_MEMORY_LIMIT=-1 composer update
版本冲突看 composer why-not 包 版本
国内下载慢配镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
class not foundcomposer dump-autoload 重建
lock 与 json 不一致composer update --lock

Friends & Partners