Composer如何在没有SSH权限的主机上安装依赖?(FTP上传方案)

1次阅读

因为没 ssh 权限无法执行 composer install,ftp 又不运行 php 进程,故只能本地安装后上传 vendor/;但必须确保本地 php 版本、扩展与线上一致,并清理无用文件、验证 autoload.php 可用性。

Composer如何在没有SSH权限的主机上安装依赖?(FTP上传方案)

为什么 composer install 不能直接在目标主机上运行? 因为没 SSH 权限,连终端都进不去,composer 命令根本执行不了。FTP 只能传文件,不跑 PHP 进程,所以「在服务器上装依赖」这条路被堵死了。 常见错误现象是:本地 composer install 后上传 vendor/,结果线上报错 class not foundrequire(): failed to open stream —— 多半是 autoloader 没生效,或平台差异导致的包兼容问题。

关键点在于:不是“能不能传”,而是“传什么、怎么传、传完怎么确保可用”。

本地安装必须用目标环境一致的 PHP 版本和扩展 否则会装错依赖版本,比如本地 PHP 8.2 装了只兼容 8.2 的 symfony/console,但线上是 PHP 7.4,运行时直接 fatal Error

  • 查清主机 PHP 版本:联系服务商、看探针页、或上传一个 phpinfo.php 文件
  • 本地用相同版本 PHP(推荐 phpbrewdocker)跑 composer install --no-dev --optimize-autoloader
  • 确认 ext-zipext-openssl 等 Composer 所需扩展已启用(否则 install 阶段就失败)
  • 避免用 composer update —— 锁定 composer.lock,只执行 install

FTP 上传前必须清理无用文件,否则容易超空间或触发安全拦截 很多 FTP 主机对单次上传文件数、总大小、甚至文件名含点号(如 .gitignore)敏感。上传整个 vendor/ 很可能卡在中间,或被防火墙删掉部分文件。

  • 删掉 vendor/bin/ 下所有可执行脚本(除非你真要用它们,而 FTP 主机又支持 CGI
  • 删掉每个包里的 .git/.github/tests/docs/ 目录(用 composer install --no-dev 已跳过 dev 包,但文档和测试仍可能残留)
  • 检查 vendor/autoload.php 是否存在且可读 —— 这是整个自动加载的入口,漏传就全崩
  • 上传后用 FTP 客户端比对文件数(如 FileZilla 的“同步浏览”),确认 vendor/composer/autoload_*.phpinstalled.json 都在

上线后第一件事:验证 autoloader 是否真能加载类 别急着打开网站首页。先写个最小验证脚本,上传到 Web 根目录同级或子目录,用浏览器访问它:

<?php require 'vendor/autoload.php'; var_dump(class_exists('MonologLogger')); ?>

如果报错 failed to open stream: No such file,说明路径不对;如果返回 bool(false),说明 autoloader 没注册成功,或者 vendor/composer/ 下的 autoload 文件损坏/缺失。 最常被忽略的是:有些主机默认禁用 allow_url_include,但某些旧版 autoloader 会间接依赖它;还有些主机把 vendor/ 放在 Web 可访问路径下,被安全规则主动拦截了 autoload.php 的执行。 路径写错、大小写敏感(linux 主机)、FTP 传输模式设成 ASCII(导致二进制文件损坏)——这些细节一出错,前面所有操作都白忙。

text=ZqhQzanResources