摔桌了!composer --version 怎么还是 PHP 8.3?

摔桌了!composer –version 怎么还是 PHP 8.3?

上篇刚费劲巴拉地让 Ubuntu 22.04 上 CyberPanel 的网站目录 Composer 用 PHP 8.4,结果你兴冲冲输了个 composer --version,屏幕上赫然显示 PHP 8.3.x……那一刻血压直接拉满对吧?别急着拔电源,这不是玄学,纯粹是 Composer 在安装时就写死了它跟哪个 PHP 版本“厮守终身”。

正常情况下,Composer 运行时会调用安装它的那个 PHP 可执行文件。如果你当初是直接用 php -r "copy(...)" 或者 apt install composer 安装的,而那个 php 指向 8.3,那么无论你后来怎么装 PHP 8.4composer 都会死死抱着 8.3 不放。更别说 CyberPanel 环境里各种版本的 PHP 互相“串台”,这局面简直灾难。

下面直给最稳的改造方案,保证不弄坏面板、也不搞疯依赖,让 composer 命令直接从 8.3 改成 PHP 8.4,还能随时回滚。

别上来就覆盖系统文件,先看清“罪魁祸首”在哪

先查明当前 composer 到底是个什么东西:

which composer
# 大概率输出 /usr/bin/composer 或 /usr/local/bin/composer
file $(which composer)
# 如果是 PHP 脚本,会显示 “PHP script...”
head -1 $(which composer)
# 第一行会显示 #!/usr/bin/env php 或者 #!/usr/bin/php8.3

 

如果你看到第一行是 #!/usr/bin/env php,那它就会调用系统默认的 php 命令,也就是 8.3。就算你改了系统默认 php 的软链接,也会影响其他工具,CyberPanel 的面板功能没准就罢工,这种“牵一发动全身”的蠢事咱不干。

所以思路变了:不要动原有 composer 文件,而是用一套安全的重定向方式,让 composer 这个命令名跑在我们指定的 PHP 8.4 上。

最推荐的方法:用 Shell 包装脚本“狸猫换太子”

还记得上次我们专门创建了 /usr/local/bin/composer84 吗?它能完美用 PHP 8.4 跑起来。现在我们要做的,就是在 PATH 里再加一个同名的 composer,但优先级高于系统那个。

创建文件 /usr/local/bin/composer,写入以下内容:

#!/bin/bash
php8.4 /usr/local/bin/composer84 "$@"

 

然后赋予执行权限:

sudo chmod +x /usr/local/bin/composer

 

现在检查一下 PATH 里 /usr/local/bin 是不是排在 /usr/bin 前面(通常都是),这样当我们敲 composer 时,就会优先执行这个自己写的脚本,它会强制用 php8.4 去调用 composer84,并把所有参数原封不动地传过去。

验证一下:

composer --version
# 现在应该看到 PHP 8.4.x 和 Composer 版本信息

 

这个方案的妙处在于:

  • 完全没动系统原生的 /usr/bin/composerCyberPanel 后台或者其他脚本如果指定了绝对路径调用 /usr/bin/composer,依然会用 8.3,互不干扰。
  • 你在终端普通用户会话里直接用 composer,无论安装、更新还是 require,都是 PHP 8.4 在干活。
  • 想临时切回 8.3?直接输 /usr/bin/composer --version 就行。

备选方案:别名法(适合不喜欢动 /usr/local/bin 的人)

如果你觉得多一个脚本文件心里膈应,那就在当前用户的 bash 配置文件里写死别名,强行把 composer 覆盖掉:

echo "alias composer='php8.4 /usr/local/bin/composer84'" >> ~/.bashrc
source ~/.bashrc

 

这样 composer 命令就只在你的终端会话里生效,完全不污染系统。但要注意,如果用 sudo 切到其他用户执行 Composer,这个别名就不会被继承,可能需要额外配置。对于只在网站目录下用特定用户跑 Composer 的场景,直接在那个用户的 ~/.bashrc 里加上别名也是稳的。

为什么会出现这种“版本分裂”的沙雕问题?

归根到底,CyberPanel 管理的前端 PHP 和你的命令行 PHP 是完全独立的两套运行时。面板里的 PHP 8.4 是 LiteSpeed 专用的,而系统 CLI 的 PHP 版本由你手动安装的包决定。当你用 aptcomposer 时,它会依赖一个叫 php-cli 的元包,而 Ubuntu 22.04 下这个元包默认指向 8.3(如果你之前装过),这就把 Composer 和 8.3 绑死了。加上很多人喜欢用 curl -sS https://getcomposer.org/installer | php 安装,那个 php 就是系统默认 8.3,绑定得更深。

现在的解决办法,其实就是强行给 Composer 换一个“发动机”——把它的执行体换成 PHP 8.4,还不惊动原来的车架子。虽然不够优雅,但真的有用,踩坑无数后的真心话。

改完之后,务必在网站目录里实测一轮

别以为 composer --version 显示 8.4 就万事大吉。进到 CyberPanel 创建的网站目录(比如 /home/yourdomain/public_html),用你网站对应的用户身份跑一下 Composer 依赖安装:

sudo -u 网站用户名 -i
cd /home/域名/public_html
composer install

 

只要没有爆出 proc_open 禁用或内存不够,而且所有包顺利下载,那就说明 PHP 8.4 真正接管了命令行下的 Composer。如果还遇到报错,回看上一篇教程里修改 php.ini 的配置,那些限制对 8.4 同样适用。

折腾完这一圈,你可能跟我有同样的感受:CyberPanel 把 PHP 版本管理做得太“分家”了,但咱们靠这种脚本包装的土办法,硬是让 Ubuntu 22.04 上 composer –version 显示 php8.3 彻底改为 php8.4,还不留后遗症。工具嘛,能用、不崩,就是王道。

万事屋原创教程 · 原文链接:https://www.rei3.com
转载请保留出处。

请登录后发表评论

    没有回复内容

万事屋新帖