不能直接同步 vendor 目录,因环境差异会导致二进制扩展失效、Class not found 等错误;正确做法是在服务器运行 composer install,确保 PHP 版本、扩展匹配,并上传 composer.json 和 composer.lock。
直接同步目录是危险且不可靠的,别这么做。
为什么不能直接 rsync / scp
本地和服务器的环境差异(PHP 版本、扩展、OS 架构、
锁定精度)会导致
中某些包的二进制扩展(如
、
)或平台相关依赖(如
的脚本)直接失效。你看到的
或
错误,八成是这么来的。
记录的是 hash 和版本,不是构建结果;不同机器上
出的
可能完全不同
本地开发可能用了
,但线上不该装
或
下的可执行文件路径、shebang 行可能硬编码了本地 PHP 路径
正确做法:在服务器上运行
核心原则:让目标环境自己生成
,而不是搬运。这要求服务器具备基础构建能力,但远比“同步失败后排查 2 小时”划算。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
确保服务器已安装匹配的 PHP 版本和必要扩展(
、
、
等)
上传
和
(必须一起传,缺一不可)
用
部署
如果服务器无法访问 packagist(比如内网),提前用
在本地打包好
并上传——但这仍是妥协方案,只适用于完全隔离环境
常见卡点与绕过方式
部署时最常卡在权限、内存、网络三块,不是 Composer 本身的问题,而是执行环境没配好。
→ 在命令前加
,或改
→ 别用全局
命令,下载最新
放项目根目录,用
→ 检查当前用户对
所在目录是否有写权限,别用
运行,也别让 web 用户拥有写权限
国内服务器拉包慢 → 配置镜像源:
(注意该镜像已停,换
)
真正麻烦的从来不是命令怎么敲,而是搞不清哪台机器该装什么扩展、
是否被意外修改、以及上线前忘了清空
这类缓存——这些细节不写进部署脚本,早晚出事。
vendorvendorcomposer.jsonvendorext-swooleext-protobufsymfony/flexClass not foundundefined symbolcomposer.lockinstallvendor--devphpunitlaravel/pintvendor/bincomposer installvendoropensslmbstringjsoncomposer.jsoncomposer.lockcomposer install --no-dev --optimize-autoloader --no-interactioncomposer install --prefer-dist --no-devvendorPHP Fatal error: Allowed memory size of XXX bytes exhaustedphp -d memory_limit=-1php.iniCould not open input file: composer.pharcomposercomposer.pharphp composer.phar installfile_put_contents(./composer.lock): failed to open stream: Permission deniedcomposer.lockrootcomposer config -g repo.packagist composer https://packagist.phpcomposer.comhttps://mirrors.aliyun.com/composer/composer.lockbootstrap/cache/config.php