【问题标题】:Tell Composer to use Different PHP Version告诉 Composer 使用不同的 PHP 版本
【发布时间】:2015-12-21 09:38:03
【问题描述】:

我已经为此困扰了几天。我使用的是 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,就像我为我的个人域名所做的那样。

标签: php linux laravel composer-php


【解决方案1】:

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.
【解决方案2】:

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

"config": {
    "platform": {
        "php": "7.1.3"
    }
}

【讨论】:

  • 我想这并不是 OP 真正要寻找的答案,但它与问题的标题非常匹配,并且可能对通过网络搜索到达这里的人有很大帮助我。
【解决方案3】:

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

所以这对我有用:

php5.6 /usr/bin/composer

【讨论】:

  • 这不是 OP 正在做的同样的事情,它对他来说失败了,因为“但它仍然失败,因为在某个地方,再次调用 PHP,但它失败了,因为它使用的是 4.4.6 ."?
  • 也许不会,因为他的做法并不完全相同
【解决方案4】:

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

composer install --ignore-platform-reqs

【讨论】:

    【解决方案5】:

    你总是可以这样使用。

    在您拥有 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 用户这样

    干杯 ;-)

    【讨论】:

      【解决方案6】:

      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,它将使用您的 PHP 版本 /usr/bin/env 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文件。
      【解决方案7】:

      试试这个方法

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

      【讨论】:

      • 这会覆盖文件开头的 shebang 吗?
      【解决方案8】:

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

      希望这对某人有所帮助。

      【讨论】:

        【解决方案9】:

        在我的情况下,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
        

        【讨论】:

          【解决方案10】:

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

          问题陈述:

          但是,我可以运行 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 docs for platform

          【讨论】:

            【解决方案11】:

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

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

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

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

            alias php="/path/to/php5"
            

            【讨论】:

            • 我没有主目录的写入权限。 1and1 用繁文缛节在这个领域乱扔垃圾。
            • 当心,这个答案可能会破坏你的系统。
            【解决方案12】:

            有两种方法可以做到。

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

            【讨论】:

              【解决方案13】:

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

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

              或者从命令行

              composer config platform.php 5.5

              【讨论】:

              • 传奇,正是我需要的:)
              【解决方案14】:

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

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

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

              【讨论】:

                【解决方案15】:

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

                1. /opt/plesk/php/&lt;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 &gt; /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
                

                【讨论】:

                • 在末尾添加“$@”,如下所示: /opt/plesk/php/7.4/bin/php /usr/local/psa/var/modules/composer/composer.phar "$ @"
                【解决方案16】:

                知道这个问题有点老了……但是如果你把 composer 拉到你的应用根目录中:

                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

                【讨论】:

                  【解决方案17】:

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

                  发件人:

                  "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的新文件中
                  【解决方案18】:

                  我使用的是 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

                  【讨论】:

                    【解决方案19】:

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

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

                    【讨论】:

                      【解决方案20】:

                      我对上述任何一个答案都不满意,我在 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 example 一样,platform 设置不会改变 任何本地 PHP 路径。相反,Composer 将使用此值来获取依赖项 仅匹配此版本。不再,它们仍然使用当前的 PHP 版本运行。只有更改 $PATH 变量才会更改用于运行下标的 PHP 版本。
                      【解决方案21】:

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

                      【讨论】:

                        【解决方案22】:

                        我有办法解决这个问题。

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

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

                        【讨论】:

                          猜你喜欢
                          • 2018-02-17
                          • 1970-01-01
                          • 2016-08-04
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-12-03
                          • 2014-07-11
                          • 2018-05-06
                          • 2021-07-25
                          相关资源
                          最近更新 更多