【问题标题】:Can I configure environment specific content?我可以配置环境特定的内容吗?
【发布时间】:2011-03-18 01:53:08
【问题描述】:

与可以根据浏览器类型生成特定内容的方式相同,有没有一种方法可以根据运行 PHP 的服务器生成特定内容,而无需参考服务器或站点名称?

例如,一种让 PHP 自动检测其所处环境并配置数据库连接、ini_set 错误等内容的方法,具体取决于它是开发环境、ITS、UAT 还是生产环境。

我想到的两种方法是识别指示开发和 QA 环境的 HTTP 标头或在 php.ini 中具有自定义属性。

我稍微醒了,发现了读取http头的php函数,但是php覆盖了我在web服务器中设置的任何东西,我不知道它们是否可以在php.ini中设置。

我不知道是否可以向 php.ini 添加自定义值,但我进行了测试,但 ini_get 找不到它(当然,我在更改 php.ini 后重新启动了 Web 服务器)。

【问题讨论】:

  • 我不想使用服务器名称,因为可能有任意数量的开发机器,QA 服务器名称可能会更改等。如果我可以通过设置它们,$_ENV 似乎是可行的方法IIS,这是我作为 Web 服务器必须使用的。
  • 经过一番研究,我找不到使用 ISAPI 添加环境变量的方法,所以转移到了 fastcgi(无论如何我都在计划这样做)。我按照说明配置 fastcgiext.ini 并在那里添加了环境变量并重新启动了 IIS,但 $_ENV 仍然为空。作为附加说明,我们当前的设置打破了生产周期的基本规则之一,因为开发和 ITS 站点是 IIS 5,UAT 可能是 IIS 6 和生产 IIS 7。我希望这将在实际出现之前得到解决是一个生产站点,但这意味着我目前仅限于 IIS 5。
  • $_SERVER['SERVER_NAME'] 由调用客户端调用服务器,而不是调用服务器本身。如果您通过 IP 而不是主机名连接,则 $_SERVER['SERVER_NAME'] 将是 IP 地址。如果您在 hosts 文件中设置了一个备用名称,$_SERVER['SERVER_NAME'] 就是那个,等等。考虑一下可能会有用。
  • 我终于整理好了。 fastCGI 的初始文档没有提到您不只是为您的站点分配一个任意编号,您需要获取该站点的 IIS 站点 ID。一旦我有了重要的信息,我就可以使用 getenv("varname") 来检索值。 $_ENV 仍然是空的,但因为我有一个方法,我很高兴。我避免使用 $_SERVER['SERVER_NAME'] 以便任何人都可以建立一个开发站点,而不是依赖 localhost 来访问它。

标签: php iis fastcgi isapi


【解决方案1】:

您可以在 apache 中指定一个环境变量(conf、vhost、.htaccess 或作为 httpd daem),然后通过 ^$_ENV^superglobal 访问它

【讨论】:

    【解决方案2】:

    我使用以下内容为不同的服务器加载不同的设置:

    switch ($_SERVER['SERVER_NAME']) {
    case 'web-host': case '10.0.0.208':
        # Set DB Settings
    case 'mydomain.com': default:
        # Live server settings
    }
    

    目前没有遇到任何问题

    【讨论】:

    • 您说无法访问服务器或站点名称 - 这是否意味着 $_SERVER['SERVER_NAME'] 不可用?
    【解决方案3】:
    【解决方案4】:

    在 IIS 上使用 FastCGI 可以设置环境变量。它们似乎对 $_ENV 不可用,但可以使用 getenv("varname") 检索。

    要在 IIS 5 或 6 中配置 FastCGI 环境变量,您需要编辑: C:\%systemdrive%\system32\inetsrv\fcgiext.ini

    例如:

    [Types]
    php=d:\Dev\PHP\php-cgi.exe
    php:1=PHP Site 1
    *=Wildcard Mapping
    
    [d:\Dev\PHP\php-cgi.exe]
    QueueLength=999
    MaxInstances=20
    InstanceMaxRequests=500
    
    [PHP Site 1]
    ExePath=d:\Dev\PHP\php-cgi.exe
    EnvironmentVars=PHPRC:d:\Dev\PHP\,SiteType:Developer
    

    在本例中,它是 IIS 5,因此只有一个站点,并且站点 ID 为 1,如 [Types] 的第 2 行所示。

    在 IIS 6 上,您可能有多个站点,以下链接告诉您如何找到站点 ID:http://weblogs.asp.net/owscott/archive/2005/07/29/how-to-find-the-siteid-in-iis5-and-iis6.aspx

    安装 IIS 7 的管理包后,显然可以通过 UI 配置 IIS 7。

    【讨论】:

      【解决方案5】:

      另一个尚未提及的替代方法是创建一个特定于服务器(但名称相同)的配置文件,该文件将包含在站点脚本的开头。在该服务器特定的配置文件中,您可以将配置变量设置为常量。这样,如果稍后加载了“通用”配置文件,则其值可能会在特定于服务器的配置文件中被覆盖,因为无法重新定义常量。您可能希望从同步中排除特定于服务器的配置文件名,或者将其保存在主要内容之外的路径中,以免被意外覆盖。

      为此,您甚至可以在 Constant Array 2 class 的帮助下配置常量数组。

      使用特定于服务器的配置文件时,您不必担心当前的 SERVER_NAME - 这使您可以更轻松地定义预期的环境,而无需考虑当前的系统名称,这对于 QA 目的也很方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-16
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2017-12-08
        • 1970-01-01
        相关资源
        最近更新 更多