ChatGPT解决这个技术问题 Extra ChatGPT

告诉 Composer 使用不同的 PHP 版本

我已经被困在这几天了。我正在使用 1and1 托管,他们的 PHP 设置有点奇怪。

如果我只使用 php composer.phar install,那么我使用的是 PHP 4.4.6,这是非常不足的。但是,我可以运行 php5.5 composer.phar install,再进一步,但它仍然失败,因为在某个地方,再次调用 PHP,但它失败了,因为它使用的是 4.4.6。

有没有办法告诉 Composer 使用 php5.5 命令?有没有人成功地在 1and1 主机上配置了 Composer?

我正在尝试让 Laravel 启动并运行(它使用 Composer)。我已经能够在我的 GoDaddy 域上做到这一点,但不是 1and1。

解决这个问题的明显方法是放弃 1and1 并让自己在服务器上运行它。
我很乐意,但这不是目前的选择。这是我们在工作中使用的服务器,我无法拨打电话。我很想抛弃这些人并使用 GoDaddy,就像我为我的个人域名所做的那样。

F
Florin

Ubuntu 18.04 案例……这适合我。

/usr/bin/php7.1 /usr/local/bin/composer update

我已经使用 sudo /opt/lampp/bin/php /usr/bin/composer install 它对我有用 谢谢+1
这与 OP 所做的和对他不起作用的(php5.5 composer.phar install)有何根本不同,因为 Composer 调用的命令仍将使用默认的 PHP 版本?自己测试一下,添加一个 "scripts" : "php-version": "php --version" 并调用例如 /user/bin/php7.4 /usr/bin/composer php-version。
@SybillePeters,将您的脚本更改为例如 "php-version": "/user/bin/php7.4 --version" 我想您可以将整个机器配置为使用 sudo update-alternatives --set php /usr/bin/php7.4php 使用特定版本
h
hakre

也许这不能完全解决您的问题,但可能会帮助从网络搜索来到这里的其他人。

只需运行命令将以下代码添加到您的 composer.json 文件中即可设置不同的 PHP 版本:

$ composer config platform.php 8.0.7
"config": {
    "platform": {
        "php": "8.0.7"
    }
}

我想这并不是 OP 真正要寻找的答案,但它与问题的标题非常匹配,并且可能对通过网络搜索到达这里的人有很大帮助,就像对我一样。
这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
D
Darius.V

在 xubuntu 上,我默认使用 php 7.2。但需要用 php 5.6 运行 composer。

所以这对我有用:

php5.6 /usr/bin/composer

这难道不是 OP 为他失败的事情,因为“但它仍然失败,因为在某个地方,再次调用 PHP,但它失败了,因为它使用的是 4.4.6。”?
也许不,因为他的做法并不完全相同
J
Jon Gibbins

如果您只需要让作曲家忽略版本要求,您可以绕过使用:

composer install --ignore-platform-reqs

这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
但是,当我遇到 OP 描述的问题时,这个命令是我的解决方案。我的解决方案的描述是准确的。
G
Galaxy IT

你总是可以使用这种方式。

在您拥有 composer.json 文件的项目文件夹中。运行命令

 php7.4 /usr/local/bin/composer install

或者

php7.4 /usr/local/bin/composer update

其中 php7.4 您的特定版本可以是(php7.0、php5.5、php7.3 等...)其中 /usr/local/bin/composer 系统文件夹的路径与作曲家

!!!你应该有 php7.4-cli

sudo apt-get install -y php7.4-cli

linux/ubuntu 用户的这种方式

干杯;-)


H
Hieu Huynh

composer 是一个 PHP 二进制脚本,它使用 Unix Shebang 来定义要执行的解释器。

root@home:~# head /usr/local/bin/composer -n 5

#!/usr/bin/env php
<?php
/*
 * This file is part of Composer.
 *


/usr/bin/php7.1 /usr/local/bin/composer update

因此,如果您在没有任何特定选项的情况下运行 composer,它将使用您在 /usr/bin/env php 处的 PHP 版本(这是您的默认 PHP)

我们可以在您的 Linux 中拥有多个 PHP 版本,您可以像这样灵活地使用哪个 PHP 版本来执行您想要的操作:

root@home:~# /usr/bin/php7.1 /usr/local/bin/composer update

要不就

root@home:~# php7.1 /usr/local/bin/composer
root@home:~# php7.2 /usr/local/bin/composer
root@home:~# php7.3 composer
...

检查 &查找所有已安装的 PHP 包,转到 /usr/bin/

root@home:~# ls /usr/bin/ | grep php
php
php5.6
php7.1
php7.2
php7.3
php-config
php-config7.1
phpdbg
phpdbg5.6
phpize
phpize7.1

没错,虽然不建议更改 composer 头部的 Shebang,但可以破坏原来的 composer.phar 文件。
Y
Yousha Aleayoub

就我而言,Composer 检测到 PHP 版本 7.2.6 但我的实际 PHP 版本是 8.0.2 。所以,我做了以下步骤,这就是我的解决方案。

步骤 01:- 将以下代码添加到您的 composer.json 文件中

"config": {
    "platform": {
        "php": "7.2.6"
    }
}

步骤 02:- 然后,运行以下命令。

C:\xampp\htdocs\your project name>composer update

这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
但这有时会有所帮助。例如,当您在 docker 中构建您的应用程序,并在本地机器上开发另一个 php 版本时
h
harrisoftware

我在 1&1 (ionos) 上也有一个共享主机帐户,这就是我必须做的:

如果您以 root ssh 帐户登录,您可以创建一个 ~/.bash_profile 并添加

alias php="php7.1"
alias composer="php7.1 composer.phar"

到它,以便您现在可以使用通常使用的命令并且它可以正常工作。 (将 composer.phar 放在您的项目文件夹根目录中)

然后,确保您的开发机器中的 laravel composer.lock 文件到达 1and1 上的项目文件夹并运行

composer install

使用@tobymackenzie 的这个提示:在共享主机上,你真的应该从你在自己机器上创建的 composer.lock 文件运行 composer install (而不是更新!)。这样,内存使用率仍然很低。

我仍然遇到工匠命令的 STDIN 问题,因此请确保将 .env 文件更改为

APP_ENV=local

因为将其设置为生产会在等待您输入 yes 时引发无限的 STDIN 警告。至少在我看来是这样。

希望这可以帮助某人。


E
Erich García

试试这个方法

ea-php72 /opt/cpanel/composer/bin/composer

这会覆盖文件开头的shebang吗?
p
pixelbrackets

现有答案部分没有回答问题,给出不起作用的建议或给出不好的建议。

该问题指出:

但是,我可以运行 php5.5 composer.phar install,再走一点,但它仍然失败,因为在某个地方,再次调用 PHP,但它失败了,因为它使用的是 4.4.6。

相反,我在这里展示了一种测试和验证建议的方法。

我希望我自己有一个更好的答案,但我不确定什么是最好的解决方案。就个人而言,我会选择一个解决方案,确保在主机上使用正确版本调用 PHP(例如,通过别名或正确设置 PHP 环境,在容器内运行整个操作或其他解决方案),无论 Composer 和添加平台 php 约束。

如果您不运行任何脚本并且只需要正确解决依赖关系的要求,config:platform:php 可能是您的朋友。

假设我们的默认 php 版本是 7.4,但我们的项目需要 7.2。

检查您的默认 PHP 版本命令行: # 显示默认 PHP 的版本 php --version # 显示默认 PHP 的路径 which php # 显示 /usr/bin/env php 的版本 # /usr/bin/env php --version 创建一个composer.json 中的测试脚本 "scripts": { "php-version": "php --version" } 现在您可以测试 Composer 调用的命令使用的 PHP 版本,例如 composer php-version /usr/bin /php7.2 /usr/bin/composer php-version 就我而言,这两个都使用我的默认 php 脚本(版本 7.4)。因此,当使用 7.2 版本运行 Composer 时,Composer 调用的脚本使用默认命令。现在让我们按照一些答案中的建议添加平台设置 "config": { "platform": { "php": "7.2.0" } } 不会更改脚本执行的任何内容:/usr/bin/php7。 2 /usr/bin/composer php-version # 结果仍然是 7.4 实际上,平台选项重要的是解决需求,所以你应该添加它(在你的项目 composer.json 中)。它只是无法解决使用正确版本的 PHP 的作曲家的上述问题。另请参阅平台的 Composer 文档。


非常感谢。这对我非常有帮助,尤其是在我们过渡到基于 Arch 的 linux 平台时,因为 php 已更新为 ver。 8
b
bernie

您可以更改您的 PATH 以覆盖 php 版本。

PATH="/home/user/bin:$PATH"

/home/user/bin(或任何其他目录)中创建一个名为 php 的符号链接到 php5 二进制文件。

另一种选择,使用 shell 别名:

alias php="/path/to/php5"

我没有对主目录的写入权限。 1and1 用繁文缛节在这个领域乱扔垃圾。
请注意,此答案可能会破坏您的系统。
A
Arshad Syed

知道这个问题有点老了......但如果你将作曲家拉到你的应用程序根目录:

https://getcomposer.org/download/

而不是依赖全局作曲家,然后你可以运行:

php56 composer.phar {你的命令}

或者我相信较新的 homstead 版本会像:

php7.1 composer.phar {你的命令}

https://laracasts.com/discuss/channels/laravel/run-composer-commands-with-different-php-versions


M
Magnus

我在 Hostgator 共享帐户上,以下对我有用:

首先,找出你想要的 PHP 版本(你可以开始输入 ea-php 并点击 TAB 列出所有以 ea-php 开头的可用可执行文件): which ea-php73 /usr/local/bin/ea-php73 然后,找出作曲家住在哪里:哪个作曲家 /opt/cpanel/composer/bin/composer 然后使用这些来运行你的作曲家命令: /usr/local/bin/ea-php73 /opt/cpanel/composer/bin/composer install


万一有人想验证它是否有效,试试这个。 stackoverflow.com/a/56379908/2190689
V
Vishal Thakur

Ubuntu 18.04 案例...这对我有用。在这里,Composer 会自动选择所需的 PHP 版本

/opt/lampp/bin/php /usr/bin/composer install

或者

 /opt/lampp/bin/php /usr/bin/composer update

N
Nick Andriopoulos

对于使用 Plesk 的人,您需要不同的部分:

从 /opt/plesk/php/

# /opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar install

...或者为了更简单,只需在 /usr/local/bin 中创建一个新文件(我喜欢 composer74 ):

cat > /usr/local/bin/composer74 创建文件粘贴以下内容:

#!/bin/bash
/opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar

进入终端

按 CTRL+D 保存文件 chmod +x /usr/local/bin/composer74 使其可执行 在任何地方使用它:

# composer74 install

在末尾添加“$@”,如下所示: /opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar "$@"
K
Karl Hill

有两种方法可以做到这一点。

告诉作曲家在终端中运行命令时忽略平台要求。

composer update --ignore-platform-reqs

告诉作曲家忽略项目根目录下 composer.json 文件中的平台要求。

"config": {  
    "platform-check": false, 
}, 

这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
P
Prasad Gayan

我们可以告诉 Composer,我们的应用程序支持哪个版本的 PHP,方法是使用 composer.json 文件中的平台配置,添加以下配置,

{
"config": {
    "platform": {
        "php": "5.5"
    }
},
"require": {
    ...
 }
}

或者从命令行

composer config platform.php 5.5


传奇,正是我需要的:)
这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
E
Ernest Elikem

我遇到了同样的问题,这就是我如何能够弄清楚如何在共享主机上使用不同的 PHP 版本运行 composer 而不会破坏系统:)

幸运的是,使用不同 PHP 版本的 composer 解决这个问题非常简单。

发现:

默认 PHP 不是从 /usr/local/bin 或类似文件夹运行的。使用

which php

或者

whereis php

不会给你最好的答案。

请遵循以下简短指南:

首先找到您的作曲家二进制文件本身的实际路径。在我的共享主机服务器上,它位于

/opt/cpanel/composer/bin/composer

我相信大多数使用 cPanel 的托管服务提供商都会有这样的作曲家之路。

接下来,为您要使用的 PHP 版本创建一个别名。在我的项目中,我需要 php 7.4 或更高版本。

如前所述,主机使用的是 cPanel,而服务器使用的实际默认 PHP 版本位于路径 /opt/cpanel/

您应该在 /opt/cpanel/ 中看到不同版本的 php(以 ea-phpxx 为前缀),例如,对于 php 7.4,它将是一个名为 ea 的文件夹-php74,对于 PHP 8.0,它将是一个名为 ea-php80 的文件夹。

现在,确保 php 存在于类似于此的路径中:

/opt/cpanel/ea-php80/root/usr/bin

如果您在文件夹中找到 php,那么您现在可以将其别名如下:

alias php='/opt/cpanel/ea-php80/root/usr/bin/php'

通过运行测试别名是否正常工作

php --version 

并检查 php 版本,如下面的屏幕截图所示:

https://i.stack.imgur.com/xY8Oe.png

现在,正常运行作曲家。例如

 php /opt/cpanel/composer/bin/composer update
 php /opt/cpanel/composer/bin/composer install
 php /opt/cpanel/composer/bin/composer install

记住我们是如何在 /opt/cpanel/composer/bin/composer 找到 composer 二进制文件的。如果这与服务器上编译器二进制文件的路径不匹配,请使用适当的路径。

我希望这有帮助。快乐编码!


C
Carlo Espino

php5.5 composer.phar install 失败,因为您的 composer.json 告诉它运行 php 而不是 php5.5,编辑文件 composer.json 替换对 php5.5 的 php 脚本引用。例子:

从:

"post-root-package-install": [
    "php -r \"copy('.env.example', '.env');\""
],

至:

"post-root-package-install": [
    "php5.5 -r \"copy('.env.example', '.env');\""
],

即使这样做,1and1 对脚本执行也有内存限制,因此 php5.5 composer.phar install 不会失败,但也不会完成执行。您仍然可以手动运行安装后的脚本。

我已按照本指南将 Laravel webapps 部署到 1and1 而不提交 vendor 目录:Deploy Laravel Webapp to 1and1


我没有 post-rootpackage-install` 字段。我应该加一个吗?
不需要,运行 cp .env.example .env 也可以达到同样的效果,它只是将 .env.example 的内容复制到一个名为 .env 的新文件中
B
Bira

必须在您的 composer.json 文件中添加两个位置以设置不同的 php 版本:

"config": {
    "platform": {
        "php": "7.4"
    }
}
"require": {
    "php": "^7.4",
}

这不会使用不同的 PHP 版本运行 Composer,而是将 Composer 配置为运行另一个 PHP 版本的依赖关系解析器。恕我直言,这不能正确回答给定的问题
h
harri

我对上述任何答案都没有运气,我在 composer.json 中有自动脚本,所以只是忽略或伪造平台只会导致脚本失败等。在命令中设置 php 版本不起作用!

然而,我确实注意到,虽然运行 which phpphp -v 返回了正确的版本 which /usr/bin/env php 返回了作曲家正在使用的有问题的 php 版本。所以在这里找到了一个很好的答案并概述如下:

问题:

/usr/bin/env php 在当前 $PATH 中查找名为 php 的可执行文件;它不关心别名、shell 函数等。如果你想让它执行 php v5.3,你必须将该版本放在名为 php 的目录中,并将该目录放在 PATH 中包含的目录之前的某个位置有问题的版本。

使固定:

创建新的 php 可执行文件夹,如下所示,其中链接您的特定 php 可执行文件:

mkdir /usr/local/bin/php-overrides
ln -s /usr/local/bin/php7 /usr/local/bin/php-overrides/php

将以下内容添加到您的 ~/.bash_profile(或其他适当的启动脚本):

PATH="/usr/local/bin/php-overrides:$PATH"

https://serverfault.com/questions/579956/alias-doesnt-work-in-script-with-usr-bin-env-php


这是正确的答案。作为 Sybille outlined with the exampleplatform 设置不会更改任何本地 PHP 路径。相反,Composer 将使用此值来获取依赖项 仅匹配此版本。不再,它们仍然使用当前的 PHP 版本运行。只有更改 $PATH 变量才会更改用于运行下标的 PHP 版本。
还有一条评论 - 有多种工具可用于通过 $PATH 环境变量更改 PHP 版本。一个例子是 github.com/webit-de/php-version-pickup。它从 .php-version 文件中获取版本并继续在当前 shell 会话中使用它,也适用于所有子进程,例如由 Composer 启动的子进程。
C
Cao Vison

我有办法解决这个问题。


    export PATH=/usr/local/Cellar/php/8.0.12/bin:$PATH && composer -vvv

临时更改环境变量并使用composer


尽管被否决,但这确实对我有用:) 使用 remi repo 中的 composer 安装 Fresh Rocky linux,composer 一直尝试使用核心系统 PHP 7.2,而不是 composer.json 包所需的 remi 中的 PHP 7.4。
A
Adam Patterson

随着 PHP 8 和 8.1 的推出,我必须在 CLI 中定期使用几个版本,而我发现这样做的最好方法是创建一个别名。

假设您使用 brew 安装,或者已经知道您的 PHP 版本在哪里。

将以下内容添加到您的 bash 配置文件中。

alias php7='/usr/local/opt/php@7.4/bin/php'
alias php8='/usr/local/opt/php@8.0/bin/php'

如果您愿意,也可以使用 brew install php@8.1 安装 PHP 8.1 并添加另一个别名。

这将允许您运行 php8 composer,您可以通过创建 index.php 文件并将 phpinfo() 添加到其中来进行快速测试。

php7 index.php | grep "PHP Version"
php8 index.php | grep "PHP Version"

D
Dave

您可以尝试将 php 和 php-config 文件复制到 /usr/local/bin 中。该路径具有更高的优先级,应该覆盖 /usr/bin 文件夹,而无需禁用 SIP。这就是我所做的。


请分享更多细节。 “SIP”是什么意思?此外,在共享主机上(如问题中所述),您无法在 /usr/local/bin 中编辑任何内容