Composer,是现代PHP开发中不可或缺的工具。它是PHP的依赖管理工具,能让我们方便地管理项目的依赖,安装、更新、自动加载第三方库,大大提升了PHP开发的效率和规范性。

在Composer出现之前,PHP的依赖管理是一个痛点。开发者需要手动下载第三方库,放到项目目录里,手动配置自动加载,手动处理依赖关系,非常麻烦。而且,不同的库可能依赖同一个库的不同版本,容易产生冲突。

Composer的出现,彻底改变了这一切。它借鉴了Node.js的npm和Ruby的bundler,引入了现代的依赖管理方式,让PHP的依赖管理变得简单、高效、规范。现在,Composer已经成为了现代PHP开发的标准工具,几乎所有的PHP框架和项目都在使用。

今天,我们来详细学习Composer,从基础使用到高级技巧,从composer.json到自动加载,帮你掌握这个现代PHP的包管理利器。

什么是Composer

Composer,是PHP的依赖管理工具,运行在命令行。它的主要功能:

  1. 依赖管理:管理项目依赖的第三方库,自动处理依赖关系和版本冲突。
  2. 包安装:从Packagist(PHP的包仓库)下载和安装第三方库。
  3. 自动加载:自动生成PSR-4/PSR-0自动加载配置,不需要手动require文件。
  4. 版本约束:通过版本约束,精确控制依赖的版本。
  5. 脚本执行:支持在安装、更新等事件中执行自定义脚本。
  6. 项目创建:通过create-project命令,从模板创建新项目。

Composer不是一个包管理器(像apt、yum那样管理系统级的包),而是一个项目级的依赖管理工具。它把依赖安装在项目的vendor目录里,每个项目可以有自己独立的依赖,互不影响。

安装Composer

Linux/Mac安装

# 下载安装脚本
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# 验证安装脚本(可选)
php -r "if (hash_file('sha384', 'composer-setup.php') === '安装脚本的SHA384哈希') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# 执行安装
php composer-setup.php

# 删除安装脚本
php -r "unlink('composer-setup.php');"

# 全局安装(移动到PATH目录)
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer

Windows安装

Windows下,最简单的方式是下载Composer-Setup.exe安装程序,双击运行,按照提示安装即可。安装程序会自动配置PATH,在命令行中就可以使用composer命令了。

也可以手动安装:下载composer.phar,放到PHP目录,创建composer.bat文件,内容为@php "%~dp0composer.phar" %*

验证安装

composer --version
# 输出:Composer version 2.x.x 2025-xx-xx xx:xx:xx

升级Composer

composer self-update

Composer基础使用

初始化项目:composer init

在项目目录下,运行composer init,会交互式地引导你创建composer.json文件:

composer init

会依次询问:

  • Package name(包名,如vendor/package)
  • Description(描述)
  • Author(作者)
  • Minimum Stability(最低稳定性,默认stable)
  • Package Type(包类型,默认library)
  • License(许可证)
  • 是否定义依赖(require)
  • 是否定义开发依赖(require-dev)

最后,会生成composer.json文件。

也可以手动创建composer.json:

{
    "name": "myvendor/myblog",
    "description": "My personal blog",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Your Name",
            "email": "your@email.com"
        }
    ],
    "require": {
        "php": ">=7.0",
        "monolog/monolog": "^1.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.0"
    }
}

安装依赖:composer install

当项目有了composer.json文件后,运行composer install,会安装所有依赖:

composer install

这个命令会:

  1. 读取composer.json
  2. 解析依赖关系
  3. 如果有composer.lock文件,按照lock文件中的精确版本安装
  4. 如果没有composer.lock,解析版本约束,确定要安装的版本,生成composer.lock
  5. 下载安装所有依赖到vendor目录
  6. 生成自动加载文件vendor/autoload.php

更新依赖:composer update

如果要更新依赖到最新版本(在版本约束范围内),运行composer update

composer update

这个命令会:

  1. 读取composer.json
  2. 重新解析版本约束,获取最新的符合约束的版本
  3. 更新composer.lock文件
  4. 更新vendor目录中的依赖

也可以只更新特定的包:

composer update monolog/monolog

添加依赖:composer require

要添加一个新的依赖,不需要手动编辑composer.json,直接用composer require

composer require monolog/monolog

这个命令会:

  1. 搜索包
  2. 确定版本(默认用最新稳定版的^约束)
  3. 添加到composer.json的require中
  4. 安装依赖
  5. 更新composer.lock

添加开发依赖(只在开发环境需要,如测试工具):

composer require --dev phpunit/phpunit

指定版本:

composer require monolog/monolog:^1.0

移除依赖:composer remove

composer remove monolog/monolog

会从composer.json中移除,并卸载依赖。

查看依赖:composer show

# 查看所有已安装的包
composer show

# 查看特定包的信息
composer show monolog/monolog

# 查看哪些包有更新
composer outdated
composer search monolog

会在Packagist中搜索相关的包。

composer.json详解

composer.json是Composer的配置文件,定义了项目的元信息和依赖。下面是常用的字段:

基本信息

{
    "name": "vendor/package",
    "description": "Package description",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "Author Name",
            "email": "author@email.com",
            "homepage": "https://example.com",
            "role": "Developer"
        }
    ],
    "homepage": "https://example.com",
    "keywords": ["keyword1", "keyword2"]
}

type字段

  • library:默认,普通库
  • project:项目
  • metapackage:空包,只包含依赖
  • composer-plugin:Composer插件

require和require-dev

{
    "require": {
        "php": ">=7.0",
        "ext-mbstring": "*",
        "monolog/monolog": "^1.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.0",
        "squizlabs/php_codesniffer": "^3.0"
    }
}
  • require:生产环境必需的依赖
  • require-dev:只在开发环境需要的依赖(测试、代码检查等),生产环境用composer install --no-dev不安装

可以依赖PHP版本和扩展:

  • php: >=7.0:要求PHP版本
  • ext-mbstring: *:要求mbstring扩展

版本约束

Composer支持多种版本约束方式:

约束示例说明
精确版本1.0.0只安装1.0.0
范围>=1.0 <2.01.0到2.0之间
通配符1.0.*1.0.x的最新版
波浪号~~1.2>=1.2 <2.0.0(只锁定第一个版本号)
脱字符^^1.2.3>=1.2.3 <2.0.0(锁定主版本号,遵循语义化版本)
分支dev-mastermaster分支的最新代码
标签v1.0.0指定的git标签

最常用的是脱字符^,它遵循语义化版本(SemVer):

  • ^1.2.3:>=1.2.3 <2.0.0(主版本号不变)
  • ^0.3.2:>=0.3.2 <0.4.0(0.x版本,次版本号不变)
  • ^0.0.3:>=0.0.3 <0.0.4(0.0.x版本,修订号不变)

语义化版本(SemVer):版本号格式为主版本.次版本.修订号

  • 主版本号:不兼容的API修改
  • 次版本号:向下兼容的功能性新增
  • 修订号:向下兼容的问题修正

autoload自动加载

{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "MyVendor\\MyPackage\\": "src/"
        },
        "psr-0": {
            "OldPackage\\": "src/"
        },
        "classmap": [
            "src/Models/",
            "src/Controllers/"
        ],
        "files": [
            "src/helpers.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    }
}

PSR-4:推荐的自动加载标准,命名空间和目录映射。

  • "App\\": "src/":App命名空间对应src目录
  • App\Models\User对应文件src/Models/User.php

PSR-0:旧的自动加载标准,已经不推荐使用。

classmap:扫描目录中的所有类,生成类映射表。适合不符合PSR-4的旧代码。

files:每次请求都加载的文件,适合全局函数文件。

修改autoload配置后,需要运行composer dump-autoload重新生成自动加载文件。

scripts脚本

{
    "scripts": {
        "post-install-cmd": [
            "App\\Installer::postInstall"
        ],
        "post-update-cmd": [
            "App\\Installer::postUpdate"
        ],
        "test": "phpunit",
        "lint": "phpcs src/",
        "serve": "php -S localhost:8000 -t public/"
    }
}

可以定义自定义脚本,用composer run执行:

composer run test
composer run serve

也可以用快捷方式:

composer test
composer serve

常用的事件脚本:

  • pre-install-cmd / post-install-cmd:install命令前后
  • pre-update-cmd / post-update-cmd:update命令前后
  • pre-autoload-dump / post-autoload-dump:自动加载生成前后

repositories仓库

默认从Packagist下载包,也可以配置自定义仓库:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://packagist.org"
        },
        {
            "type": "vcs",
            "url": "https://github.com/yourname/yourpackage.git"
        },
        {
            "type": "path",
            "url": "../local-package"
        }
    ]
}

仓库类型:

  • composer:Composer仓库(如Packagist、私有Satis)
  • vcs:版本控制系统(Git、SVN等)
  • path:本地路径
  • package:直接定义包信息

config配置

{
    "config": {
        "vendor-dir": "vendor",
        "bin-dir": "bin",
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true,
        "platform": {
            "php": "7.2.0"
        }
    }
}
  • vendor-dir:依赖安装目录,默认vendor
  • bin-dir:可执行文件目录,默认vendor/bin
  • preferred-install:优先安装方式,dist(压缩包)或source(源码)
  • sort-packages:排序composer.json中的包
  • optimize-autoloader:优化自动加载(生成classmap,提升性能)
  • platform:模拟平台版本,用于在不同环境中保持一致

minimum-stability和prefer-stable

{
    "minimum-stability": "stable",
    "prefer-stable": true
}
  • minimum-stability:最低稳定性,可选stable、RC、beta、alpha、dev。默认stable。
  • prefer-stable:优先选择稳定版本,即使有开发版本。

composer.lock文件

composer.lock是Composer生成的锁文件,记录了所有依赖的精确版本。

为什么需要lock文件

composer.json中的版本约束(如^1.0)是一个范围,不同时间安装,可能得到不同的版本。composer.lock记录了精确的版本(如1.2.3),确保所有开发者和生产环境安装的版本完全一致,避免"在我机器上能运行"的问题。

lock文件的使用

  • composer install:如果有lock文件,按照lock文件的精确版本安装;如果没有,解析版本约束,生成lock文件。
  • composer update:重新解析版本约束,更新依赖,更新lock文件。

版本控制

  • composer.json:必须提交到版本控制
  • composer.lock:应用项目应该提交到版本控制,确保团队和生产环境版本一致;库项目可以不提交(让使用者自己解析)
  • vendor目录:不应该提交到版本控制,加入.gitignore

Packagist

Packagist(https://packagist.org),是Composer的默认包仓库,是PHP的包聚合平台。

几乎所有知名的PHP库,都在Packagist上发布。你可以在Packagist上搜索包,查看包的信息、版本、下载量、依赖等。

要发布自己的包到Packagist:

  1. 把代码推送到GitHub(或其他Git平台)
  2. 在Packagist注册账号
  3. 提交包,输入GitHub仓库地址
  4. 配置GitHub Service Hook,自动更新包信息

自动加载的使用

安装依赖后,Composer会生成vendor/autoload.php文件。在项目中,只需要引入这个文件,就可以自动加载所有依赖和自己的类:

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

// 现在可以直接使用第三方库,不需要手动require
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

$log->warning('Foo');
$log->error('Bar');

// 也可以使用自己的类(配置了PSR-4自动加载)
use App\Models\User;

$user = new User();

常用最佳实践

1. 版本约束用^

推荐使用脱字符^作为版本约束,遵循语义化版本,既能获取更新,又不会有不兼容的升级。

{
    "require": {
        "monolog/monolog": "^1.0",
        "guzzlehttp/guzzle": "^6.0"
    }
}

2. 提交composer.lock

应用项目,一定要提交composer.lock到版本控制,确保所有环境版本一致。

3. 生产环境用--no-dev和--optimize-autoloader

生产环境安装依赖时,用--no-dev不安装开发依赖,用--optimize-autoloader优化自动加载,提升性能:

composer install --no-dev --optimize-autoloader

4. 用require添加依赖

不要手动编辑composer.json添加依赖,用composer require命令,它会自动处理版本约束和安装。

5. 定期更新依赖

定期运行composer outdated查看哪些依赖有更新,及时更新依赖,获取bug修复和安全更新。但更新前要测试,避免兼容性问题。

6. 不要提交vendor目录

vendor目录不提交到版本控制,加入.gitignore。每个人用composer install安装自己的依赖。

7. 用脚本简化常用命令

在composer.json的scripts中定义常用命令(测试、代码检查、启动服务等),用composer run执行,统一命令,方便使用。

常见问题

Q: Composer安装很慢怎么办?

A: 可以配置国内镜像,加速下载。

阿里云镜像:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

腾讯云镜像:

composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/

恢复官方源:

composer config -g --unset repos.packagist

Q: 内存不足怎么办?

A: Composer在解析依赖时可能消耗大量内存,可以增加PHP内存限制:

php -d memory_limit=-1 /usr/local/bin/composer install

Q: 版本冲突怎么办?

A: 当多个依赖依赖同一个包的不同版本,且版本范围不兼容时,会产生冲突。解决方法:

  1. 升级或降级某个依赖,使版本范围兼容
  2. composer whycomposer why-not查看依赖关系,找到冲突原因
  3. repositories指定特定版本
# 查看某个包被谁依赖
composer why monolog/monolog

# 查看为什么不能安装某个版本
composer why-not monolog/monolog 2.0.0

Q: 如何安装开发版本?

A: 用dev-分支名指定开发版本:

{
    "require": {
        "vendor/package": "dev-master"
    }
}

需要设置minimum-stability为dev,或者在包级别指定稳定性:

{
    "require": {
        "vendor/package": "dev-master@dev"
    }
}

实战:在博客项目中使用Composer

下面,以我们的博客项目为例,演示如何使用Composer。

1. 初始化项目

cd /path/to/blog
composer init

按照提示填写信息,生成composer.json。

2. 添加常用依赖

# 日志库
composer require monolog/monolog

# HTTP客户端
composer require guzzlehttp/guzzle

# 模板引擎(如果需要)
composer require twig/twig

# 开发依赖:PHPUnit
composer require --dev phpunit/phpunit

# 开发依赖:代码检查
composer require --dev squizlabs/php_codesniffer

3. 配置自动加载

在composer.json中配置PSR-4自动加载:

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

把项目的类放到src目录,按照PSR-4规范组织:

  • App\Models\Usersrc/Models/User.php
  • App\Controllers\PostControllersrc/Controllers/PostController.php

运行composer dump-autoload生成自动加载文件。

4. 在项目中使用

<?php
// index.php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use App\Core\Router;
use App\Core\Config;

// 初始化日志
$log = new Logger('blog');
$log->pushHandler(new StreamHandler(__DIR__ . '/logs/app.log', Logger::DEBUG));

// 初始化配置
$config = new Config(__DIR__ . '/config');

// 路由
$router = new Router($config, $log);
$router->dispatch();

5. 定义脚本

{
    "scripts": {
        "test": "phpunit",
        "lint": "phpcs src/",
        "serve": "php -S localhost:8000 -t public/",
        "post-install-cmd": [
            "App\\Installer::postInstall"
        ]
    }
}

使用:

composer test     # 运行测试
composer lint     # 代码检查
composer serve    # 启动开发服务器

6. 部署

生产环境部署:

# 安装依赖(不安装开发依赖,优化自动加载)
composer install --no-dev --optimize-autoloader

# 设置权限
chmod -R 755 vendor
chmod -R 777 storage logs

总结

Composer,是现代PHP开发的包管理利器,彻底改变了PHP的依赖管理方式。

核心要点:

  1. 什么是Composer:PHP的依赖管理工具,项目级,管理依赖、安装包、自动加载
  2. 安装:Linux/Mac用安装脚本,Windows用Composer-Setup.exe
  3. 基础命令:init初始化、install安装、update更新、require添加、remove移除、show查看、search搜索、self-update升级
  4. composer.json:基本信息、require/require-dev、版本约束(^/~/*)、autoload(PSR-4推荐)、scripts脚本、repositories仓库、config配置
  5. composer.lock:锁定精确版本,确保环境一致,应用项目必须提交
  6. Packagist:默认包仓库,PHP的包聚合平台
  7. 自动加载:引入vendor/autoload.php,自动加载所有依赖和自己的类
  8. 最佳实践:用^版本约束、提交lock文件、生产用--no-dev --optimize-autoloader、用require添加依赖、定期更新、不提交vendor、用脚本简化命令
  9. 常见问题:国内镜像加速、内存不足、版本冲突、开发版本安装

Composer,已经成为了现代PHP开发的标准工具。掌握Composer,能让你的PHP开发更高效、更规范、更现代。无论是使用第三方库,还是管理自己的项目依赖,Composer都是不可或缺的工具。

"工欲善其事,必先利其器。"希望这篇文章,能帮你掌握Composer,让你的PHP开发更加高效和规范。