独立分区本身不影响 Composer 运行,真正卡住或报错的几乎全是 PHP 环境、权限、镜像配置三者未对齐——尤其挂载后 UID/GID 不匹配、CLI php.ini 与 Web 不一致、全局镜像源失效或挂载选项含 noexec。

独立分区本身不影响 Composer 运行,真正卡住或报错的,几乎全是 PHP 环境、权限、镜像配置三者之一没对齐——尤其挂载后用户 UID/GID 变更、PHP CLI 配置未同步、或 composer.json 里写了硬编码路径时会立刻暴露。
确认 PHP CLI 在挂载分区上能真实执行
挂载新分区(比如 /mnt/app)后,php -v 可能仍显示正常,但实际调用的是旧环境的 PHP 二进制或扩展。关键要验证:当前 shell 下、在挂载点目录内运行的 PHP 是否启用必需扩展。
- 进入挂载目录:
cd /mnt/app - 检查 ZIP 支持:
php -r "new ZipArchive();"—— 报Class 'ZipArchive' not found就得装php-zip并确认 CLI 模式 php.ini 启用了extension=zip - 检查禁用函数:
php -r "var_dump(ini_get('disable_functions'));"—— 输出必须不含proc_open、curl_exec、exec - 若用宝塔或自编译 PHP,CLI 的
php.ini路径常和 Web 不同,用php --ini确认并修改对应文件
挂载后用户权限与 Composer 执行身份不一致
常见于用 root 挂载、但项目需普通用户(如 www-data 或 deploy)运行 composer install。此时即使目录可读写,Composer 仍可能因缓存目录(~/.composer/cache)属主不对而静默失败或报 Permission denied。
- 先查当前用户:
whoami,再查挂载点归属:ls -ld /mnt/app - 确保该用户对以下路径有完整读写权:
/mnt/app/vendor、/mnt/app/composer.lock、~/.composer/cache - 别用
sudo composer install—— 它会让vendor/归属变成 root,后续 Web 服务无法加载;正确做法是chown -R deploy:deploy /mnt/app,再以deploy用户执行 - Docker 或 systemd 场景下,注意服务定义里
User=设置是否匹配实际 PHP 进程用户
镜像源配置失效:挂载 ≠ 配置继承
挂载分区只是磁盘位置变更,Composer 全局配置(~/.composer/config.json)仍按当前用户 HOME 查找,不会自动“跟着分区走”。如果之前在旧系统配过镜像,换分区后没重配,composer install 会直连 packagist.org,国内大概率卡在 “Loading from cache” 或报 cURL error 28。
- 运行
composer config -g repo.packagist看输出是否为腾讯或阿里镜像地址;不是就立刻重设:composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/ - 末尾斜杠
/必须保留,键名必须是repo.packagist(不是repos.packagist或packagist.org) - 换源后务必清缓存:
composer clear-cache,否则旧缓存仍尝试请求官方域名 - 项目级
composer.json若含"repositories"字段(哪怕空对象{}),全局镜像会被完全忽略
PATH 和执行权限:挂载后命令找不到或 Permission denied
composer 命令本身是软链接或脚本,挂载新分区后,shell 的 $PATH 不变,但若之前把 composer.phar 放在旧根分区的 /usr/local/bin,而新分区没挂载到 /usr,就可能找不到命令。
- 查命令位置:
which composer或whereis composer - 若返回空或路径不在当前挂载体系内,重新安装:
curl -sS https://getcomposer.org/installer | php && sudo mv composer.phar /usr/local/bin/composer && sudo chmod +x /usr/local/bin/composer - 确认
/usr/local/bin在当前用户$PATH中:echo $PATH | grep '/usr/local/bin',没有就临时加:export PATH="/usr/local/bin:$PATH" - 永久生效写入
~/.bashrc(普通用户)或/etc/profile(系统级)
最易被忽略的点:挂载选项。如果用了 noexec 或 nosuid,composer.phar 即使有 +x 权限也执行不了;用 mount | grep /mnt/app 看参数,必要时 remount 加 exec。


















