如何在 php 中使用 getenv() 和在 .htaccess 中使用 SetEnv,并在共享主机上使用已编译的 php-cgi

2022-08-31 00:54:10

只需在上下文中澄清主要问题:

在我的开发机器上,PHP5.3.1作为模块安装在Apache上,我使用SetEnv APPLICATION_ENVIRONMENT应用程序的根.htaccess文件中进行开发。然后,可以使用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,任何想法如何解决这个问题?


答案 1

好吧,我终于明白了。在 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')检索;


答案 2

要使 SetEnv 指令正常工作,您的托管服务必须激活模块...mod_env

但是,即使它被激活,也许你不必获得使用SetEnv的权限。

只是为了确定问题不在你的代码中,你可能想检查phpinfo()的输出:在页面底部,应该有一个包含环境变量的部分,如PHP所示 - 如果你的不在那里,这对你来说不是一个好兆头......


推荐