16

只是为了澄清主要问题:

在我的开发机器上,PHP5.3.1 作为模块安装在 Apache 上,我在应用程序的根 .htaccess 文件中使用 SetEnv APPLICATION_ENVIRONMENT 开发。然后可以使用 getenv('APPLICATION_ENVIRONMENT') 从任何 php 脚本轻松检索它。

在生产服务器上,在共享主机(dreamhost)上,我自己编译了 php5.3.1,因为它不被直接支持。一切正常,除了 getenv('APPLICATION_ENVIRONMENT') 返回 false。

在我的域的共享主机根 .htaccess 中,我使用这个 .htaccess 文件

Options +ExecCGI
AddHandler php-cgi .php
Action php-cgi /cgi-bin/php.cgi

<FilesMatch "^php5?\.(ini|cgi)$">
    Order Deny,Allow
    Deny from All
    Allow from env=REDIRECT_STATUS
</FilesMatch>

Options -indexes

php5.cgi 位于 /cgi-bin 并且运行良好。当然,在我的应用程序的根文件夹中,我还有另一个 .htaccess 定义:

SetEnv APPLICATION_ENVIRONMENT production

但是当使用 getenv('APPLICATION_ENVIRONMENT') 时它返回 false,知道如何解决这个问题吗?

4

3 回答 3

15

好的,我终于明白了。在dreamhost 上,可以使用fastcgi,因此可以使用它声明环境变量。它包括添加这个简单的脚本

#!/bin/sh
export PHP_FCGI_CHILDREN=2
exec /home/USERNAME/YOURDOMAIN/cgi-bin/php.cgi

这是我编译的 PHP5.3.1 所在的位置。chmod 744 在名为 dispatch.fcgi 的文件上,dreamhost 的看门狗将允许更多内存。

之后,我将以下内容添加到我的域的 .htaccess 中:

Options +ExecCGI
AddHandler fastcgi-script fcg fcgi fpl
AddHandler php5-fastcgi .php
Action php5-fastcgi /dispatch.fcgi

现在在应用程序的根目录中我有另一个 .htaccess :

SetEnv APPLICATION_ENVIRONMENT staging

在 php 脚本中可以通过 getenv('REDIRECT_APPLICATION_ENVIRONMENT');

于 2010-01-05T21:22:57.113 回答
10

要使SetEnv指令生效,您的托管服务必须mod_env激活模块...

但是,即使它被激活了,也许你不需要获得使用权限SetEnv

为了确保问题不在您的代码中,您可能需要检查phpinfo(): 在页面底部的输出,应该有一个包含从 PHP 中看到的环境变量的部分——如果您的不在其中,它是对你来说不是个好兆头...

于 2010-01-05T18:57:25.453 回答
0

为了让 $_ENV 工作,我必须variables_order = "GPCSE"在 php.ini 中重新配置。默认情况下,$_ENV 不包含 E,它原本是variables_order = "GPCS"

该指令确定 PHP 启动时注册哪些超级全局数组。G、P、C、E 和 S 是以下各自超级全局变量的缩写:GET、POST、COOKIE、ENV 和 SERVER。注册这些阵列会带来性能损失,并且由于 ENV 不像其他阵列那样常用,因此不建议在生产服务器上使用 ENV。如果需要,您仍然可以通过 getenv() 访问环境变量。

默认值:“EGPCS”

开发价值:“GPCS”

产值:“GPCS”;

http://php.net/variables-order

于 2019-05-30T05:21:31.427 回答