关于不同 PHP 版本和 Composer 有大量答案。但似乎没有一个能解决我的问题。
为了某个项目,我必须在 Ubuntu 上从 PHP8 切换回 PHP7。 到目前为止没问题 - 我安装了不同的 PHP 版本,并且在 PHP 版本之间切换很容易:
update-alternatives --set php /usr/bin/php7.4
update-alternatives --set phar /usr/bin/phar7.4
update-alternatives --set phar.phar /usr/bin/phar.phar7.4
然后我在我的项目文件夹中运行
composer update
:
php7.4 /usr/bin/composer update
我在使用composer时遇到以下错误:
Parse error: syntax error, unexpected '|', expecting variable (T_VARIABLE) in
/usr/share/php/Psr/Log/LoggerInterface.php on line 30
问题很明显,Psr 库是 PHP8。
我的问题:显然我的库需要不同的 /usr/share/php/ 位置 - 通用文件夹无法完成这项工作,因为此文件夹中的库需要随 PHP 版本而更改。
我不知道 /usr/share/php/ 在哪里配置 - 也不知道为什么 Composer 使用这个 Psr 东西。根本不。我想我还需要安装不同的作曲家版本?
首先,根据Composer的文档:
Composer 的最新版本需要 PHP 7.2.5 才能运行。长期支持版本 (2.2.x) 仍提供对 PHP 5.3.2+ 的支持,以防您无法使用旧版 PHP 版本。
所以,只要您使用的是 7.2.5 或更高版本,就应该没问题。其次,我自己也管理着几个PHP版本各异的项目。我在 Fish shell 中创建了一些别名,以确保我使用具有正确 PHP 版本的 Composer(否则,它可能会拉取错误的依赖项),并且这些别名执行的功能与您手动执行的功能相同:
alias composer5="php5.6 $(which composer)"
alias composer7="php7.4 $(which composer)"
alias composer8="php8.1 $(which composer)"
我从未遇到过这种方法的问题,特别是因为
composer
是一个独立的 PHAR 存档,不需要任何外部依赖项。
现在,关于
/usr/share/php/Psr/Log/LoggerInterface.php
的问题,这是由系统范围的包含路径引起的,导致该位置在运行时被包含,因为包是在您使用 PHP 8 时安装的,因此代码使用 PHP 8 功能,现在,当您尝试使用 PHP 7 并且该包被拉取时,会导致语法错误。
快速搜索 Ubuntu 软件包数据库,发现这可能来自
php-psr-log
软件包,表明您可能使用 APT 安装了一些 PHP 软件包,从而导致安装了此依赖项。我总是不鼓励人们从 Debian 软件包安装任何 PHP 应用程序,除非它是唯一安装的 PHP 软件包/应用程序(例如在容器/VPS 等中)。这始终是重大问题的根源。您唯一应该安装的是 PHP 解释器,或许还有作曲家 PHAR;就是这样。任何其他依赖项都应该是保存在其 vendor/
文件夹中的本地包依赖项。
以下是我建议的步骤,用于检查您使用 APT 安装了哪些 PHP 软件包:
dpkg -l "*php*" | grep ii
此命令只会列出名称中包含
php
单词的包(例如,即使您有 mediawiki
包也不会显示它),但如果您看到的不仅仅是 PHP 本身,请考虑删除它们。您还可以使用 apt-cache
检查真正取决于您发现可疑的软件包的内容,即:
apt-cache rdepends php-psr-log
提示您也可以根据
php
解释器查找包。
如果目前无法删除这些
/usr/share/php/
文件,我认为有一些选项值得考虑:
/usr/share/php/
不在您的包含路径中。但是又来了。没有全局安装任何东西。