Composer是项目级依赖管理器,PEAR是系统级包安装工具;Composer按项目隔离依赖并支持自动加载和精确版本锁定,PEAR则全局共享包且无自动加载机制。

Composer 是项目级依赖管理器,PEAR 是系统级包安装工具
Composer 解决的是“这个项目需要哪些 PHP 类库、用什么版本”,所有依赖默认装进 vendor/ 目录;PEAR 解决的是“让这台服务器上的所有 PHP 项目都能用上某个通用工具或类”,安装路径固定在 PHP 的全局 include_path 里。这意味着:同一个服务器跑两个项目,一个要用 monolog 2.x,另一个必须用 monolog 1.x —— Composer 可以轻松共存,PEAR 会直接报错或覆盖冲突。
- PEAR 安装的包(比如
Console_Getopt)对所有项目可见,升级一次就全变,没人敢在生产环境乱动 - Composer 的
composer.json和生成的composer.lock能精确锁定每个依赖的提交哈希,CI/CD 部署时不会因网络或源更新导致行为突变 - PEAR 不解析嵌套依赖:A 依赖 B,B 依赖 C 且要求 C>=3.0,而你本地只有 C 2.5 —— PEAR 就卡住不动;Composer 会回退、尝试、报冲突,并给出可读提示
自动加载机制差异直接决定你写不写 require
Composer 原生支持 PSR-4,只要在 composer.json 里配好命名空间和路径映射,new App\Http\Controller\Home() 就能直接 new,背后由 vendor/autoload.php 自动搞定;PEAR 完全不提供自动加载,你得手动 require 'Console/Getopt.php',还得确保路径拼对、大小写一致、文件存在 —— 一不小心就是 Class 'Console_Getopt' not found。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- PEAR 包通常用下划线分隔类名(
DB_Common),对应文件是DB/Common.php,但加载逻辑靠__autoload或手动 include,无统一规范 - Composer 默认生成的
autoload.php是单入口,项目启动时require_once 'vendor/autoload.php'一次就够了 - 如果你混用 PEAR 包(比如旧系统遗留的
Mail_mime),可以用 Composer 的peartype 支持:"repositories": [{"type": "pear", "url": "https://pear.php.net"}],但别指望它自动处理 PEAR 的package.xml依赖树
现在还能不能用 PEAR?能,但只该用在极少数场景
PEAR 没被删掉,PHP 8.3 仍带 pear 命令,但它已不是“可用”,而是“勉强能跑”。官方文档明确建议新项目用 Composer;Packagist 上超 38 万个包,PEAR 官方仓库只剩不到 200 个活跃维护的包,且多数是十年前的代码。
- 唯一合理使用 PEAR 的场景:给没有 Composer 环境的老服务器装一个纯命令行工具(比如
php_codesniffer),且确认它不和其他项目共享依赖 -
pear install常因 SSL 证书过期、HTTP 重定向失败、XML 解析错误而中断,而composer install有重试、缓存、离线 fallback - 想装 PECL 扩展(如
redis、protobuf)?那是 C 编写的 PHP 扩展,跟 PEAR/Composer 都无关 —— 得用pecl install或系统包管理器(apt install php-redis)
迁移老 PEAR 项目到 Composer 的实际步骤
别重写,先兼容。PEAR 包名(如 Net_SMTP)在 Packagist 上大多有镜像,格式是 pear/net_smtp。重点不是“换工具”,而是“让旧代码继续跑起来”。
- 运行
composer init,按提示填基本信息,然后手动加依赖:"require": {"pear/net_smtp": "^1.10"} - 把旧代码里所有
require_once 'Net/SMTP.php'替换成require_once 'vendor/autoload.php',并确认类名大小写(Net_SMTP→Net\SMTP) - PEAR 的配置文件(
pear.conf)不用管;Composer 的配置全在composer.json,config.platform.php可模拟目标环境 PHP 版本防踩坑 - 如果遇到
Class 'PEAR' not found,说明代码直接继承了 PEAR 的基类 —— 这类包(如PEAR_Error)基本无维护,建议找现代替代(如psr/log+monolog)

















