【问题标题】:Setting PHP enviromental variable while running command line script在运行命令行脚本时设置 PHP 环境变量
【发布时间】:2013-08-08 12:17:18
【问题描述】:

我需要从命令行运行 PHP 脚本,并且需要设置一些环境变量。不幸的是,以下不起作用:

php -dAPPLICATION_ENV=staging script.php

我想要完成的是设置APPLICATION_ENV 变量。

【问题讨论】:

  • -d 和 APPLICATION_ENV 之间的空格是错字吗?尝试把 putenv("APPLICATION_ENV=staging");在 script.php 中
  • 您需要在脚本中设置一些变量,还是从脚本中访问环境变量?如果是后者,您使用什么代码访问它?
  • 在脚本中用getenv()函数检索变量。

标签: php command-line environment-variables command-line-arguments


【解决方案1】:
APPLICATION_ENV=staging php script.php

变量将在 $_SERVER 数组中可用:

echo $_SERVER['APPLICATION_ENV'];

【讨论】:

  • 截至 2021 年 10 月,PHP 7.4,这会引发警告。
【解决方案2】:

无法通过将选项传递给 PHP 二进制文件来从命令行设置环境变量,专门用于执行脚本。

你有几个选择:

  1. 在系统上全局设置变量。
  2. 在调用脚本之前在命令行上设置变量。在您的脚本完成执行后,这将在环境中持续存在,您可能不希望这样做。
  3. 将 PHP 脚本包装在另一个脚本中,允许您创建一个仅在脚本执行期间存在的临时变量。
  4. 使用命令行选项而不是环境变量。

最后两个选项可能是最简洁的方法,因为创建的变量仅在脚本运行时存在。

选项 1 的实现取决于系统。

选项 2 的实现也取决于系统 - 在 Windows 上,您可以使用 set APPLICATION_ENV=staging&& php script.php,而在 *nix 上,它会是 export APPLICATION_ENV='staging' && php script.php

如果您选择选项 3,您可能会想选择一个 shell 脚本,但这不是可移植的(您需要一个用于 Windows 的批处理文件和一个用于 *nix 环境的 shell 脚本。相反,我会建议你编写一个简单的 PHP 包装脚本,如下所示:

<?php

    putenv('APPLICATION_ENV=staging');

    include('script.php');

这允许您保持目标脚本不变并仅为脚本的会话设置环境变量。

可以轻松创建更复杂的包装脚本,允许您在命令行上指定变量,甚至动态指定设置这些变量时应执行的脚本。

选项 4 可以使用 $argv 变量来实现:

<?php

    $applicationEnv = $argv[1];

    // rest of you script

...并像这样调用脚本:

php script.php staging

但是,在我看来,您似乎是在向脚本指示正在运行的环境(暂存、开发、实时等)——在这种情况下,设置服务器范围的变量并重命名可能是最简单的必要时防止与其他应用程序可能正在设置的变量发生冲突。这样您就可以简单地调用脚本而无需担心这一点。这是假设您的暂存环境运行在与实时不同的机器上(应该是)。

【讨论】:

  • 这应该是选择的答案,因为包装脚本要求您的部署管理员执行相同数量的工作并使用相同数量的变量,但您可以更好地控制正在运行的内容,而不是希望环境变量适用于您的软件可能部署到的未知系统。
【解决方案3】:

当您从命令行执行 PHP 脚本时,它会继承您的 shell 中定义的环境变量。这意味着您可以使用 export 命令设置环境变量,如下所示:

export APPLICATION_ENV='staging'

【讨论】:

  • 我知道,我只是不想改变脚本。
【解决方案4】:

这里是设置一个环境变量的示例:

ENV_VAR='var' php script.php 

以防万一您想设置多个变量 试试这个:

ENV_VAR1=1 ENV_VAR2=2 ENV_VAR3=3 php script.php 

【讨论】:

    【解决方案5】:

    您可以在/etc/environment 中设置一个变量,例如FOO="bar",然后可以在 CLI 和 Web 请求中使用 getenv() 访问该变量。您可能需要重新登录才能使此更改生效。

    【讨论】:

    • +1 对于“您可能需要重新登录 [in] 才能使此更改生效”。我一直在用头撞墙,想知道为什么我的 /etc/environment 中的东西不起作用,直到我看到这条评论。
    • 实际上有一个有趣的情况,/etc/environment 没有被加载。我必须手动将source /etc/environment 添加到我的~/.bashrc
    【解决方案6】:

    尝试使用putenv并通过参数传递变量

    php script.php APPLICATION_ENV=staging
    

    并且在script.php代码中:

    for($i=1;$i<count($argv);$i++){
         putenv($argv[$i]);
    }
    

    【讨论】:

      【解决方案7】:

      我有同样的情况,我使用下一个代码(它适用于我):

      export APPLICATION_ENV=staging && php script.php
      

      希望对你也有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 2012-03-27
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        相关资源
        最近更新 更多