提问人:ESP32 提问时间:10/13/2023 最后编辑:Mark RotteveelESP32 更新时间:10/14/2023 访问量:150
编写不同的PHP版本和通用PSR
Composer different PHP versions and common PSR
问:
在不同的PHP版本和Composer上有大量的答案。但似乎没有一个能解决我的问题。
对于某个项目,我必须在我的 Ubuntu 上从 PHP 8 切换回 PHP 7。
到目前为止没有问题 - 我安装了不同的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 库只是 PHP 8。
似乎我需要为我的库设置不同的位置 - 一个通用文件夹无法完成这项工作,因为此文件夹中的库需要随着 PHP 版本而更改。/usr/share/php/
我不知道在哪里配置 - 也不知道为什么作曲家使用这个 PSR 的东西。完全。我想我还需要安装不同的作曲家版本?/usr/share/php/
回复评论:
- 我的作曲家版本是 2.4.1
- “第二个错误消息”是复制/粘贴块。对不起 - 已删除。
apt-cache rdepends php-psr-log
列出作曲家等- 重命名 /usr/share/php/Psr 会导致以下错误:在 /usr/share/php/Composer/XdebugHandler/autoload 中打开需要“Psr/Log/auto.php load”(include_path='.:/usr/share/php')失败.php
- 我尝试在我的项目中安装 PSR 日志依赖项 ()。然后我又跑了一次,但第 30 行仍然出现同样的错误。
php8.1 composer require psr/log:^1.0 --ignore-platform-req=all --no-update
php7.4 composer update
答:
首先,根据 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)"
我从未遇到过这种方法的问题,特别是因为这是一个独立的 PHAR 存档,不需要任何外部依赖项。composer
现在,关于 的问题,这是由系统范围的包含路径引起的,导致在运行时包含此位置,因为包是在您使用 PHP 8 时安装的,因此代码使用 PHP 8 功能,现在,当您尝试使用 PHP 7 并且该包被拉取时,它会导致语法错误。/usr/share/php/Psr/Log/LoggerInterface.php
对 Ubuntu 软件包数据库的快速搜索显示,这可能来自软件包,这表明您可能使用 APT 安装了一些 PHP 软件包,这导致了安装此依赖项。我总是不鼓励人们从 Debian 软件包安装任何 PHP 应用程序,除非它是唯一安装的 PHP 软件包/应用程序(例如在容器/VPS 等中)。这始终是重大问题的根源。您唯一应该安装的是 PHP 解释器,也许还有作曲家 PHAR;就是这样。任何其他依赖项都应该是保存在其文件夹中的本地包依赖项。php-psr-log
vendor/
以下是我推荐的步骤,以检查您使用 APT 安装了哪些 PHP 包:
dpkg -l "*php*" | grep ii
这个命令只会列出名称中包含单词的包(例如,即使你有它,包也不会出现),但如果你看到的不仅仅是PHP本身,请考虑删除它们。此外,您还可以检查真正取决于您发现可疑的软件包,即:php
mediawiki
apt-cache
apt-cache rdepends php-psr-log
提示,您也可以根据解释器查找包。php
如果目前无法删除这些文件,我认为有一些选项值得考虑:/usr/share/php/
- 在运行时调整 PHP,确保它不在 include 路径中。
/usr/share/php/
- 将这些文件(暂时)移开,这样就不会在运行时使用。但这可能会破坏其他包裹,所以要小心。
- 重新安装必须使用 PHP 7 全局安装的软件包。这将使它们仍然适用于 PHP 8(除非有错误)和 PHP 7。
但又一次。没有全局安装任何内容。
评论
您的问题是使用 apt.
你不应该这样做,因为它会在系统范围内安装自己的依赖项。例如,PHP 是 Composer 的依赖项,或者您在问题中提到的这些 PSR 库。
使用系统的包管理器删除 composer,然后使用这些说明直接安装 Composer。
除非需要,否则不要在项目中安装 PSR 依赖项。对于它的外观,你不知道,它只是它们是由 apt 安装的。
评论
update-alternatives
update-alternatives --config php
/usr/share/php
听起来不像是 Composer 应该使用的东西?并且:“显然,我的库需要不同的 /usr/share/php/ 位置”——为什么这很明显?