直接复制vendor目录可行,但需确保PHP版本、扩展、Composer版本完全一致;否则因autoload路径固化、映射失效或扩展缺失,仍会Class not found。

能直接复制 vendor 目录就别折腾其他方式——这是最稳、最快、最省事的离线迁移法,前提是源和目标环境 PHP 版本、扩展、Composer 版本三者完全一致。
为什么 vendor 目录复制后还报 Class not found
不是文件没拷全,而是 vendor/autoload.php 里记录的是源机路径,或 autoload 规则没重建。目标机即使有全部文件,require 时仍找不到类。
- 源机打包前必须执行:
composer install --no-dev --optimize-autoloader,确保 autoloader 是扁平、可移植的 - 目标机不能直接运行
php index.php测试,得先require 'vendor/autoload.php'看是否报错 - 如果源机用了
classmap或自定义psr-4映射,目标机路径结构(如项目根目录名)必须一模一样,否则映射失效
composer install --no-plugins --no-scripts 还是失败?检查 COMPOSER_DISABLE_NETWORK
很多人加了所有 --no- 参数仍卡在 Could not fetch https://repo.packagist.org/packages.json,根本原因是没设环境变量切断网络通路。
- 必须前置设置:
COMPOSER_DISABLE_NETWORK=1,否则 Composer 会尝试 fallback 校验远程元数据,哪怕vendor/已存在 - 推荐完整命令:
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader - 执行完立刻补一记:
composer dump-autoload -o,否则运行时大概率出错——这个步骤常被跳过
目标机缺 mbstring、openssl 等扩展,但 install 不报错?
--ignore-platform-reqs 会让 Composer 忽略扩展缺失,看似成功,实则埋雷:运行时才爆 Class not found 或 Call to undefined function mb_strlen()。
- 目标机必须提前装好所有
composer.json中声明的ext-xxx扩展,比如"ext-mbstring": "*" - 验证方法:在目标机跑
php -m | grep -E "mbstring|openssl|curl",一个都不能少 - PHP 版本小版本差异(如 8.2.12 vs 8.2.13)也可能导致内部 API 变更,引发 autoload 失败,建议严格对齐
真正麻烦的从来不是拷文件,而是环境一致性——PHP 小版本、扩展启用状态、甚至 vendor/ 下软链接是否有效(path 仓库需配 "options": {"symlink": false}),这些细节不盯住,离线部署就会在最后一秒崩掉。


















