繁体   English   中英

告诉 Composer 使用不同的 PHP 版本

[英]Tell Composer to use Different PHP Version

我已经被困在这几天了。 我正在使用 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 上执行此操作。

Ubuntu 18.04 案例……这适合我。

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

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

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

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

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

所以这对我有用:

php5.6 /usr/bin/composer

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

composer install --ignore-platform-reqs

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

在您拥有 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 用户的这种方式

干杯;-)

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 检测到 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

我在 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 警告。 至少在我看来是这样。

希望这可以帮助某人。

试试这个方法

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

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

该问题指出:

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

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

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

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

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

  1. 检查您的默认 PHP 版本

    命令行:

     # shows version of default PHP php --version # show path of default PHP which php # show version of /usr/bin/env php # /usr/bin/env php --version
  2. 在您的 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 调用的脚本使用默认命令。

  3. 现在让我们按照一些答案中的建议添加平台设置

    "config": { "platform": { "php": "7.2.0" } }

    不会更改脚本执行的任何内容:

     /usr/bin/php7.2 /usr/bin/composer php-version # result is still 7.4

    实际上,平台选项对解决需求很重要,因此您应该添加它(在您的项目 composer.json 中)。 它只是无法解决使用正确版本的 PHP 的作曲家的上述问题。 另请参阅平台的 Composer 文档

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

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

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

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

alias php="/path/to/php5"

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

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

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

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

或者

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

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

  1. 首先,找出你想要的 PHP 版本(你可以开始输入ea-php并点击TAB列出所有可用的以ea-php开头的可执行文件):

    which ea-php73

     /usr/local/bin/ea-php73
  2. 然后,找出作曲家住在哪里:

    which composer

     /opt/cpanel/composer/bin/composer
  3. 然后使用它们来运行您的作曲家命令:

    /usr/local/bin/ea-php73 /opt/cpanel/composer/bin/composer install

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

  1. /opt/plesk/php/<version/bin/php获取所需的 PHP 版本,例如/opt/plesk/php/7.4/bin/php
  2. 通过查看脚本内容 ( cat /usr/local/bin/composer ) 获取 composer 的真实路径,因为/usr/local/bin/composer是一个自定义的 Plesk 脚本。 就我而言,它是/usr/local/psa/var/modules/composer/composer.phar
  3. 把它们放在一起:
# /opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar install

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

  1. cat > /usr/local/bin/composer74创建文件
  2. 粘贴以下内容:
#!/bin/bash
/opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar

进入终端

  1. CTRL+D保存文件
  2. chmod +x /usr/local/bin/composer74使其可执行
  3. 在任何地方使用它:
# composer74 install

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

  1. 告诉作曲家在终端中运行命令时忽略平台要求。
composer update --ignore-platform-reqs
  1. 告诉作曲家忽略项目根目录下composer.json文件中的平台要求。
"config": {  
    "platform-check": false, 
}, 

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

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

或者从命令行

composer config platform.php 5.5

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目录: 将 Laravel Webapp 部署到 1and1

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

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

我对上述任何一个答案都没有运气,我在 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

我遇到了同样的问题,这就是我如何能够弄清楚如何在共享主机上使用不同的 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 版本,如下面的屏幕截图所示:

在此处输入图像描述


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

 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 二进制文件的 如果这与服务器上编译器二进制文件的路径不匹配,请使用适当的路径。

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

在尝试使用 SSH 在我的 SiteGround 共享主机上安装 Laravel 应用程序时,我必须在执行 composer 之前指定足够的 PHP bin 常量:

PHP_BIN=php81 composer install

这里的其他解决方案不起作用。

我有办法解决这个问题。


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

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

linux的简单解决方案:

/path/to/phpversion $(which composer) install

$(which composer)返回作曲家的路径

随着 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"

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

在带有 php74 的php74上我的默认 PHP 版本, php81安装到/usr/bin/php81和 composer 在位置/usr/bin/composer ,以下工作一次:使用php81运行 composer 。

/usr/bin/php81 /usr/bin/composer install

作曲家标志可以添加如下:

/usr/bin/php81 /usr/bin/composer install --no-dev --no-interaction --ignore-platform-reqs

请注意,这些命令需要从您的工作文件夹中执行。

CentOS/Fedora 或来自 Red Hat Enterprise Linux 的任何发行版上游源代码

就我而言

/usr/local/bin/php81 /usr/local/bin/composer.phar update

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM