在不同的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。
看起来我需要不同的/usr/share/php/
位置来存放我的库--一个普通的文件夹不能完成这项工作,因为这个文件夹中的库需要随着PHP版本的变化而变化。
我不知道/usr/share/php/
是在哪里配置的,也不知道composer为什么要使用这个PSR。在所有.我想我需要安装不同的 composer 版本以及?
在答复评论时:
- 我的版本是2.4.1
- “第二个错误消息”是复制/过去块。抱歉,已删除。
apt-cache rdepends php-psr-log
列出了 composer 等- 重命名/usr/share/php/Psr导致此错误:无法打开所需的'Psr/Log/autoload.php'(include_path ='.:/usr/share/php')在/usr/share/php/Composer/XdebugHandler/autoload. php
- 我尝试在我的项目(
php8.1 composer require psr/log:^1.0 --ignore-platform-req=all --no-update
)中安装PSR日志依赖项。然后我再次运行php7.4 composer update
,但第30行仍然是同样的错误。
2条答案
按热度按时间qgelzfjb1#
您的问题是使用apt安装Composer。
你不应该这样做,因为它会在系统范围内安装自己的依赖项。例如,PHP是一个Composer依赖项,或者你在问题中提到的这些PSR库。
使用系统的软件包管理器删除Composer,然后直接使用these instructions安装Composer。
不要在项目中安装PSR依赖项,除非你需要它们。看起来,你没有,这只是他们安装的apt。
eqfvzcg82#
首先,根据Composer的文档:
Composer的最新版本要求PHP 7.2.5才能运行。一个长期支持版本(2.2.x)仍然提供对PHP 5.3.2+的支持,以防您被遗留的PHP版本卡住。
所以,只要你是在7.2.5或更高版本,你应该是好的。其次,我自己也管理几个PHP版本不同的项目。我在我的Fish shell中创建了一些别名,以确保我使用的Composer是正确的PHP版本(否则,它可能会提取错误的依赖项),这些别名执行的功能与您手动执行的功能相同:
我从来没有遇到过这种方法的问题,特别是因为
composer
是一个自包含的PHAR归档,不需要任何外部依赖。现在,关于
/usr/share/php/Psr/Log/LoggerInterface.php
的问题,这是由系统范围的包含路径引起的,导致这个位置在运行时被包含,因为包是在你使用PHP 8时安装的,所以代码使用PHP 8的功能,现在,当你尝试使用PHP 7时,那个包被拉出来,它会导致语法错误。快速的search on the Ubuntu package database显示,这可能来自
php-psr-log
包,表明您可能使用APT安装了一些PHP包,这导致安装了此依赖项。我总是不鼓励人们从Debian软件包中安装任何PHP应用程序,除非它是唯一安装的PHP软件包/应用程序(比如在容器/VPS等中)。这始终是重大问题的根源。您应该安装的唯一的东西是PHP解释器,也许还有 composer PHAR;任何其他依赖项都应该是保存在vendor/
文件夹中的本地包依赖项。以下是我推荐的步骤,以检查您使用APT安装了哪些PHP软件包:
这个命令只会列出名字中包含
php
的包(例如,mediawiki
包不会显示how up,即使你有它),但是如果你看到的不仅仅是PHP本身,考虑删除它们。您也可以使用apt-cache
检查您发现可疑的软件包,即:提示您也可以根据
php
解释器查找软件包。如果目前无法删除这些
/usr/share/php/
文件,我认为有一些选项值得考虑:1.在运行时调整PHP,确保
/usr/share/php/
不在包含路径中。1.将这些文件(临时)移走,以便在运行时不使用它们。但这可能会破坏其他包,所以要小心。
1.使用PHP 7重新安装您必须全局安装的软件包。这将使它们仍然可以在PHP 8(除非有bug)和PHP 7中工作。
但再次.不要有任何安装全球.