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:找不到命令

Composer 在安装 Laravel 时显示错误

为啥我会收到 Laravel Composer 解析错误?

Laravel 6.0 Composer 依赖升级错误

安装 Laravel 时出现 Composer 错误:缺少“mbstring”?

安装 sanctum 时 Laravel Composer 错误:与合同冲突