我正在尝试安装一个较旧的Laravel项目。
当我运行作曲家安装时,出现以下错误
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 )
这是我的作曲家.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?
谢谢。
composer clear-cache
composer self-update
composer update --ignore-platform-reqs
or
composer install --ignore-platform-reqs
其他信息和对@nicohase的回应,Nico,当你说作曲家没有使用与 Apache 相同的 PHP 可执行文件时,你是对的。 为什么作曲家要确保 php-cli 满足其他所需包的要求? 它不会也不会。 用户正在使用php-cli管理作曲家,这本质上意味着它们是兼容的。 Composer 正在检查以确保在 Web 服务器上运行的 php 版本与其他包兼容。
现在,至于为什么,我列出的方法和另一篇文章建议的方法都是可能的解决方案。Composer 缓存有关系统、php 和安装的软件包的信息,原因有两个,1.连续性。。2. 版本历史记录。 如果 compator 在发生外部更改时修改了自己的缓存文件,则很难知道哪些包版本彼此兼容以及何时兼容。
因此,作曲家在进行更新或安装时不会检查 php 版本,而是引用其缓存。 Apache可能会对用户禁用的php版本进行任何引用,它会在作曲家的缓存文件中找到引用。我的建议建议出于这个原因删除缓存。 此外,
composer --self-update
告诉作曲家更新自己,而不是它管理的包......
composer update
此时,如果PHP最初是通过yum/apt安装的,然后由Easy Apache升级,那么--ignore-platform-reqs标志将绕过任何可能仍然存在的RPM Exclusion功能,并允许安装或更新Composer软件包。
我也遇到过这个问题。如果您不想更新所有作曲家包,可以通过手动更改composer.lock
文件并在 JSON 对象中以platform > php
编写实际的 PHP 版本来解决此问题。
例
...
"platform": {
"php": "7.1"
}
...
尽管它有效,但最推荐的方法是删除composer.lock
文件,在composer.json
中更改platform > php
版本,然后执行composer install
.
在我的 HostGator 共享主机上,我能够通过在我的 .bashrc 文件中为我想使用的 php 版本创建别名来克服这个问题:
alias php='/opt/php71/bin/php'
alias composer="/opt/php71/bin/php ~/bin/composer/composer.phar"
请记住在编辑 .bashrc 文件后获取源:"source ~/.bashrc">
如果将来对某人有所帮助,我在尝试从 PHPStorm (2017.2) 中运行作曲家更新时遇到了这个问题。 我尝试了上述建议,但没有一个奏效。 我安装了多个版本的 PHP(5.6、7.0、7.1),所有这些都在 PHPStorm 设置下添加,因此我可以根据项目要求进行切换。 无论选择何种 CLI 解释器设置,在调用作曲家时,它始终会查找 PHP 7.0。 在 PHPStorm 之外的终端中运行 compator 工作没有问题(引用路径配置版本 7.1)。 就我而言,这感觉就像一个PHPStorm错误。
对于 Laravel 代客泊车用户
如果您使用的是 Laravel 代客 (https://laravel.com/docs/8.x/valet)
您需要运行运行
valet use php --force
之后
composer global update
这是一个配置/环境问题。理想情况下,您可以使用多个 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
> 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
我只是在 VS Code 内部运行composer update
时遇到了这个问题。
问题是VS Code的集成终端认为我使用的是PHP 7.1,而我的MacOS系统也有PHP 8.0。
我尝试从另一个终端运行composer update
,Hyper Terminal
它起作用了。
当我输入:
$ /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的作曲家插件使用系统默认的shell,而不是首选项中定义的shell,后者在PATH上有一个旧的PHP版本。– 马萨法蒂
所以我能够通过在我的主"配置.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');
我会记住这一点,以便将来发布答案。 伊利基尔58
我遇到了同样的问题,运行valet isolate php@7.3
对我有用。
希望有帮助。
这是完整而正确的解决方案。
降级 PHP-CLI 版本
sudo update-alternatives --config php
显示如下所示的输出:
sudo update-alternatives --config php
There are 4 choices for the alternative php (providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.1 81 auto mode
1 /usr/bin/php5.6 56 manual mode
2 /usr/bin/php7.2 72 manual mode
3 /usr/bin/php7.4 74 manual mode
4 /usr/bin/php8.1 81 manual mode
Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/php7.4 to provide /usr/bin/php (php) in manual mode
为 Apache 降级
sudo a2dismod php8.1
sudo a2enmod php7.4
sudo systemctl restart apache2
参考:链接