Laravel Composer 看到错误的 PHP 版本
Posted
技术标签:
【中文标题】Laravel Composer 看到错误的 PHP 版本【英文标题】:Laravel Composer sees wrong PHP Version 【发布时间】:2018-03-28 21:34:10 【问题描述】:我正在尝试安装一个较旧的 Laravel 项目。
当我运行 composer install 我得到以下错误
This package requires php >=5.6.4 but your PHP version (5.5.35) does not satisfy that requirement.
当我跑步时
php -v
我得到以下结果
PHP 7.1.10 (cli) (built: Oct 12 2017 14:00:12) ( ZTS )
这是我的 composer.json 的内容
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require":
"php": ">=5.6.4",
"doctrine/dbal": "^2.6",
"guzzlehttp/guzzle": "^6.3",
"intervention/image": "^2.4",
"intervention/imagecache": "^2.3",
"laravel/framework": "5.4.*",
"laravel/tinker": "~1.0",
"laravelcollective/html": "^5.4",
"maatwebsite/excel": "^2.1",
"sentry/sentry-laravel": "^0.8.0",
"spatie/laravel-glide": "^3.2",
"spatie/laravel-permission": "^2.6",
"spatie/laravel-pjax": "^1.3"
,
"require-dev":
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~5.7"
,
"autoload":
"classmap": [
"database"
],
"psr-4":
"App\\": "app/"
,
"autoload-dev":
"psr-4":
"Tests\\": "tests/"
,
"scripts":
"post-root-package-install": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"php artisan key:generate"
],
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"php artisan optimize"
],
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"php artisan optimize"
]
,
"config":
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
这个项目怎么可能认为我运行了 php 5.6?
谢谢。
【问题讨论】:
您的系统中可能安装了多个 PHP 版本,并且您的 Web 服务器配置为使用 5.5.35。检查您的网络服务器的配置文件。 不要运行php -v
,它会给你一个不同的加载php模块。使用phpinfo()
查找服务器上配置的版本
真的很好奇,composer/artisan不使用PHP的CLI版本吗?
好吧,伙计们,这很奇怪,作曲家更新成功了,而且我没有收到有关锁定文件已过时的警告...
@Notflip 你用的是什么网络服务器?
【参考方案1】:
我也遇到过这个问题。如果您不想更新所有 composer 包,您可以通过手动更改 composer.lock
文件并在 JSON 对象中的 platform > php
中写入您的实际 PHP 版本来解决此问题。
示例
...
"platform":
"php": "7.1"
...
虽然可行,但最推荐的方法是删除您的 composer.lock
文件,更改 composer.json
中的 platform > php
版本,然后执行 composer install
。
【讨论】:
这是一个很好的解决方案!我猜比更新更好。我总是害怕更新后会出问题 这是一个很好的解决方案!感谢您提供信息 gd.silva。 @Notflip 我认为我的回答也适合你,对吧? 是的,在大多数情况下更新所有内容并不是最佳选择。 这是一个非常好的解决方案。我只想添加“平台”子句应该在“配置”子句中。【参考方案2】:这是一个配置/环境问题。理想情况下,您可以使用多个 php 版本进行测试,在 apache 中您可以像这样交换版本:
Example:
sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart
这里发生的事情是当他运行 php -v 他正在运行配置为在 php7 中运行的 php-cli,但也许他的 apache 启用了 5.5。 所以
sudo a2dismod php5.5
sudo a2enmod php7.0
sudo service apache2 restart
【讨论】:
您能解释一下更改网络服务器使用的 PHP 版本会如何影响最终不使用该版本的作曲家吗? 就我而言,这对我有帮助,呵呵,即使它超出了主题:)【参考方案3】:如果它对将来的某人有所帮助,我在尝试从 PHPStorm (2017.2) 内部运行 composer update 时遇到了这个问题。我尝试了上述建议,但都没有奏效。我在 PHPStorm 设置下安装了多个版本的 PHP(5.6、7.0、7.1),所以我可以根据项目要求进行切换。无论选择何种 CLI 解释器设置,在调用 composer 时它总是使用 PHP 7.0。在 PHPStorm 之外的终端中运行 composer 没有问题(参考路径配置版本,7.1)。就我而言,这感觉像是一个 PHPStorm 错误。
【讨论】:
如果有人来到这里,我的问题是(在 mac 上)我在终端应用程序和 PhpStorm 上切换到zsh
shell,但系统默认设置仍设置为 bash
。 PhpStorm 的 composer 插件使用系统默认 shell 而不是 Preferences 中定义的那个,它在 PATH 上有一个旧的 PHP 版本。【参考方案4】:
composer clear-cache
composer self-update
composer update --ignore-platform-reqs
or
composer install --ignore-platform-reqs
其他信息和对@nicohase 的回复,Nico,当您声明 composer 没有使用与 apache 相同的 php 可执行文件时,您是正确的。为什么 composer 会确保 php-cli 满足其他所需软件包的要求?它不会也不会。用户正在使用 php-cli 管理 composer,这本质上意味着它们是兼容的。 Composer 正在检查以确保在 web 服务器上运行的 php 版本与其他软件包兼容。
现在,至于为什么,我列出的方法和另一篇文章建议的方法都是可能的解决方案。 Composer 缓存有关系统、php 和已安装包的信息有两个原因,1. 连续性.. 2. 版本历史。如果 Composer 在发生外部更改时修改了自己的缓存文件,则很难知道哪些包版本相互兼容,以及何时兼容。
因此,当更新或安装发生时,composer 不会检查 php 版本,它会引用其缓存。 Apache 可能会 greps 对用户禁用的 php 版本的任何引用,它会在作曲家的缓存文件中找到引用。我的建议建议出于这个原因删除缓存。此外,
composer --self-update
告诉作曲家更新自己,而不是它管理的包...
composer update
此时,如果 php 最初是通过 yum/apt 安装的,然后通过 easy apache 升级,--ignore-platform-reqs 标志将绕过可能仍然存在的任何 rpm 排除功能,并允许安装或作曲家包的更新。
【讨论】:
您能对此添加一些解释吗?为什么你认为这可以解决问题? 那么,如果您要使用“忽略平台要求”来规避它,为什么要清除缓存并更新作曲家呢? composer install --ignore-platform-reqs 是真正的魔法,非常感谢@gavintfn【参考方案5】:在我的 HostGator 共享主机上,我能够通过在我想要使用的 php 版本的 .bashrc 文件中创建别名来克服这个问题:
alias php='/opt/php71/bin/php'
alias composer="/opt/php71/bin/php ~/bin/composer/composer.phar"
编辑完.bashrc文件记得要source:'source ~/.bashrc'
【讨论】:
有一个类似的托管问题,允许切换 PHP 版本,用类似的解决方法解决:***.com/a/58641446/473990【参考方案6】:我刚刚在 VS Code 中运行 composer update
时遇到了这个问题。
问题是 VS Code 的集成终端认为我使用的是 PHP 7.1,而我的 MacOS 系统也有 PHP 8.0。
我尝试从另一个终端 Hyper Terminal
运行 composer update
,它成功了。
当我输入时:
$ /usr/bin/php -v
从 VS Code 的终端内部,它显示 7.1。
当我输入时:
$ which php
/usr/local/bin/php
$ /usr/local/bin/php -v
它显示 PHP 8。
解决方案
是从 HyperTerm 而不是 VS Code 运行 composer update
。
这条评论很有帮助:
如果有人来到这里,我的问题是(在 mac 上)我在终端应用程序和 PhpStorm 上切换到 zsh shell,但系统默认设置仍设置为 bash。 PhpStorm 的 composer 插件使用系统默认 shell 而不是 Preferences 中定义的那个,后者在 PATH 上有一个旧的 PHP 版本。 – mjsarfatti
【讨论】:
【参考方案7】:phpinfo() 为您提供项目运行的实际版本的 apache 版本,如果您想更改它,只需按照以下步骤操作:
安装你想安装的php版本:
sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get update
//replace X with the version you want
sudo apt-get install php7.X-fpm php7.X-curl php7.X-mbstring php7.X-mysql -y
现在重启你的 apache:
sudo service apache2 restart
禁用当前的 php 版本(phpinfo() 给你的那个):
sudo a2dismod php7.2
现在启用你刚刚安装的 php 版本:
sudo a2enmod php7.X
【讨论】:
【参考方案8】:所以我可以通过在我的主 'config.php' 中更改 PHP 的版本来解决这个问题。在 '$required_php_version = 7.2' 之前,我已经升级到 8.0.9,所以它没有采用正确的版本,所以我将其更改为 '$required_php_version = 8.0.9'。或者在这里可以简单地放置大于特定版本的内容。
然后在“composer.json”和“composer.lock”文件中更改所需的php版本以反映相同。
//detect enviroment
$required_php_version = '8.0.9';
$detect_compentent_list = array('mysqli_connect', 'mod_rewrite', 'ZipArchive', 'gd', 'curl', 'bcmath');
$detect_directory_list = array('upload', 'backup', 'application/config', 'application/logs', 'application/cache/ci_session', 'application/libraries');
我会在以后发布的答案中记住这一点。 Elikill58
【讨论】:
感谢您的回答,但尽量不要将代码或配置显示为图片,因为图片可能会过期,我们无法复制/粘贴它【参考方案9】:对于 Laravel Valet 用户
如果你使用 Laravel Valet (https://laravel.com/docs/8.x/valet)
你需要运行运行
valet use php --force
然后
composer global update
【讨论】:
以上是关于Laravel Composer 看到错误的 PHP 版本的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5/Composer 终端错误:sh.exe”:composer:找不到命令