使用内置的PHP Web服务器设置环境变量

36
PHP 5.4支持用于开发目的的内置Web服务器。我们正在开发的应用程序通过环境变量进行配置。
对于Apache,您可以这样做:
SetEnv FAVORITE_COLOR white

使用普通的命令行界面,您可以这样做:

$ export FAVORITE_COLOR=black
$ php -a
php > echo $_SERVER['FAVORITE_COLOR'];

有没有一种方法可以为内置的Web服务器设置这些变量?

getenv 返回了什么内容吗? - Charles
这很令人不安。如果您使用setenv,能否在getenv$_ENV中获得相同的值?我想亲自测试一下,但我手头没有5.4的副本。 - Charles
使用 putenv("FAVORITE_COLOR=VIOLET_BLUE") 设置的变量可以通过 getenv("FAVORITE_COLOR") 检索,但 $_ENV 将保持为空。有点令人不安,但这是事实。 - Brad Koch
如果在启动 Web 服务器之前导出了环境变量,则应该可以工作。你可能需要每个请求都这样做?你能否给出一些示例代码,更详细地说明何时/何处以及你正在尝试设置什么?例如,是针对最终页面还是路由脚本? - hakre
如果除了运行PHP进程本身之外,确实没有设置内置Web服务器的环境变量的方法,您可以考虑将此报告为http://bugs.php.net。 - KingCrunch
显示剩余4条评论
3个回答

54

看起来内置服务器在 variable_order 设置中排除了 E。如果您将 E 添加到 variable_order 设置中,它就可以工作:

test.php

<?php
var_dump($_ENV['FOO']);

Shell:

FOO=BAR php -d variables_order=EGPCS -S localhost:9090 /tmp/test.php

输出:

string 'BAR' (length=3)

测试过的PHP版本为5.4.12


1
如果您想知道为什么在Symfony2中设置容器参数不起作用,请查看此问题:https://github.com/symfony/symfony/issues/10208 - Philipp Rieber
4
无法让它出现在 $_SERVER 中吗? - caesarsol
1
@caesarsol 看起来是一个在2014年报告的PHP问题,在2015年被标记为无法修复。https://bugs.php.net/bug.php?id=67808 - Will B.
1
$_ENV 似乎不太可靠,因为它可能在 php.ini 中被禁用,而我们可能无法更改。我发现当 PHP 7 CLI Web 服务器中 $_ENV 为空时,getenv() 可以正常工作。然而,如果这些环境变量是通过 Apache 或 NGINX 设置的,则它们会出现为 CGI 变量,并且似乎 Apache 和 NGINX 填充了 $_SERVER,但不一定填充了 getenv - CMCDragonkai
这在Windows上可行吗?我尝试了 BASE_URL=http://localhost:3000 php -d variables_order=EGPCS -S localhost:3000 但是得到了 'BASE_URL' 不是内部或外部命令的提示。 - lomse
1
@lomse 在 Windows 的 git-bash shell 中对我有效,如果您已安装 Linux 子系统,则可能也适用。 - MSpreij

1

我使用Windows的DOS命令行来启动PHP服务器。我将启动服务器所需的命令保存在文本批处理文件(.bat)中,这样可以避免我在一次性复制并粘贴命令到DOS终端时手动选择和复制命令。请注意最后一个空行也需要复制,这样当我将这些命令粘贴到DOS中时,PHP服务器将自动启动,否则我将需要手动使用Enter键来启动服务器。

Q:
cd Q:\GitLabRepos\myapps\test1
set APPLICATION_TITLE=My testing application with this first env variable
set SOME_OTHER_ENV_VAR2={"myJsonElement":"some value"}
E:\PHP8\php.exe -d variables_order=E -S localhost:8000 -c php.ini


上述命令的解释如下:
第一行Q:将目录更改为我的代码所在的驱动器。第二行cd Q:\GitLabRepos\myapps\test1将目录更改为我的根PHP应用程序代码(这是我想要启动PHP服务器的地方)。接下来,我在第三和第四行设置了一些环境变量。最后,我使用-d variables_order=E参数启动PHP服务器,以便我可以在我的PHP代码中使用$_ENVgetenv()来检索环境变量的值(例如 $_ENV ['APPLICATION_TITLE'] getenv('APPLICATION_TITLE'))。如果从服务器启动命令中排除-d variables_order=E,则只能使用getenv()访问环境变量。我使用-c php.ini参数从php.ini文件加载其他PHP设置,但对于简单的服务器设置可以省略此参数。
然后,如果我有一个Q:\GitLabRepos\myapps\test1\index.php脚本,并且其中包含以下代码:
<?php
echo getenv('APPLICATION_TITLE').'---'.$_ENV['APPLICATION_TITLE'].'...'.getenv('SOME_OTHER_ENV_VAR2');
?>

如果我在浏览器中访问localhost:8000,应该会看到我的测试应用程序带有此第一个环境变量---我的测试应用程序带有此第一个环境变量...{"myJsonElement":"some value"}

-4

在Windows上:

SET FOO=BAR
php -s localhost:9090

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接