【问题标题】:What is the best way to determine which server the script is on and therefore the configuration in PHP?确定脚本在哪个服务器上以及 PHP 中的配置的最佳方法是什么?
【发布时间】:2008-10-20 05:37:45
【问题描述】:

我正在尝试确定让 PHP 脚本确定脚本/站点当前正在哪个服务器上运行的最佳方法。

目前我有一个switch(),它使用$_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] 来确定它在哪个服务器上。然后它会根据它所在的服务器设置一些路径、数据库连接参数、SMTP 参数和调试设置。 (根据站点需要,可能还有其他参数。)

这意味着我可以简单地将站点放到任何已配置的服务器上,而无需更改任何代码(特别是配置)。如果是新服务器,那么我只需添加一个新的case,然后就可以使用了。

我们已经根据相同的SERVER_NAME:SERVER_PORT 组合加载了配置文件,但发现这是您必须维护的另一个文件,而且我们不确定解析 ini 文件的速度,(尽管每个都有额外的案例服务器可能同样慢)。

我们遇到的另一个问题是网站经常在两台服务器之间移动,但我们在每台服务器上使用相同的SERVER_NAMESERVER_PORT。这意味着我们需要暂时评论一个案例并确保它不会进入 repo。

还有其他想法?它需要在所有服务器上都可用(有时SERVER_NAMESERVER_PORT 不可用)。如果它与 CLI PHP 一起工作,那就太好了。

【问题讨论】:

    标签: php configuration


    【解决方案1】:

    如何使用 $_SERVER['SERVER_ADDR'] 并根据服务器的 IP 地址确定您的身份。

    更新:在虚拟主机情况下,您可能还希望将 IP 与文档根路径连接起来,如下所示:

    $id = $_SERVER['SERVER_ADDR'] . $_SERVER['DOCUMENT_ROOT'];
    

    【讨论】:

    • 因为我们经常使用共享服务器,有时不使用 SSL,我们可能在同一台服务器上多次使用同一个站点,因此使用相同的 IP。
    • 在这种情况下,您可能必须将服务器 IP 或主机名与文档根路径结合起来。希望这对您来说足够独特。
    【解决方案2】:

    我们使用 $_SERVER['HTTP_HOST'] 变量创建 PHP 包含文件的文件名,该文件包含所有虚拟主机特定信息(我们将相同的软件部署到许多虚拟主机)

    我喜欢这种技术,因为您可以巧妙地使用它来构建配置层次结构,例如对于 www.foo.com,

    • 尝试加载com.config.php
    • 尝试加载foo.com.config.php
    • 尝试加载www.foo.com.config.php

    通过这种方式,您可以为全球所有实时站点设置选项,并根据需要调整各个站点。我们也有自己的开发者沙箱内部根域名,所以我们可以在 internal.config.php 中启用所有开发者级别的选项

    您也可以反向执行此操作,即尝试加载 www.foo.com.config.php,只有在未找到时才尝试加载 foo.com.config.php,依此类推。效率更高,但灵活性稍差。

    【讨论】:

      【解决方案3】:

      您可以检查以下变量:

      $_SERVER['HTTP_HOST'];
      

      当php通过apache运行时,我用这个来检查我在哪个服务器上。

      $_SERVER['USER'];
      $_SERVER['LOGNAME'];
      

      当我知道我正在从控制台运行时,我会使用这两个。其中之一总是解析为可用的用户名。控制台模式下似乎没有其他主机定义变量。

      这可能对您的帮助不够;如果你发现你仍然很难唯一地识别你所在的服务器,你可以给它一点“推送”。在我的情况下,我有一个小配置文件,每个服务器都是唯一的,基本上设置一个 php 变量来定义我正在运行的 environment(例如 development生产。)这样,您只需要在源代码管理之外维护一个易于重新创建的小文件。

      【讨论】:

        【解决方案4】:

        我一直在我的网站上保留一个 config.php,存储可能对该服务器非常有用的信息。

        • 进行 php 解析几乎(例如,需要打开、关闭文件等)与将代码放在每个脚本顶部一样快,并且比 ini 和 xml 配置解决方案快得多
        • 每个服务器上的站点配置的集中位置,因此很容易保持最新状态(服务器不会经常更改,使用更新脚本更新配置很简单)。
        • 可以由脚本生成,我所有的站点都有一个使用 $config[] assoc 数组重建配置文件的功能。
        • 影响配置文件的更新就像“$config['key'] = 'new value';config_update()”一样简单

        【讨论】:

          【解决方案5】:

          我一直在使用以下机制:

          if(__FILE__ === '/Sites/mywebsite.com/includes/config.php')
              define('SERVER', 'DEV');
          else
              define('SERVER', 'PRODUCTION');
          

          我的开发环境有一个相当独特的路径结构,所以这很好用,我不需要担心是否将其他域添加到 $_SERVER[HTTP_HOST],或者提供不正确 HTTP_HOST 值的客户端(尽管这种情况很少见...)。

          【讨论】:

            【解决方案6】:

            为什么你没有将每个主机的配置文件存储在项目目录之外并从 php 代码中读取?

            拥有特定于主机的代码并不是一个好习惯。

            【讨论】:

              【解决方案7】:
              $posix_uname   = function_exists('posix_uname') ? posix_uname() : null;
              $this_hostname = !empty($_SERVER["HOSTNAME"]) ? $_SERVER["HOSTNAME"] : $_ENV["HOSTNAME"];
              $this_hostname = !empty($this_hostname) ? $this_hostname : $posix_uname['nodename'];
              

              【讨论】:

                【解决方案8】:

                我们为此使用环境变量(ENVPHP 环境变量将包含特定的服务器环境 - 即开发/测试/生产)。这种方法也适用于 CLI 脚本(对于 CLI,您可以设置操作系统环境变量,对于 Apache,您可以在主机配置中使用 SetEnv 开关)。在 PHP 中,您使用 getenv('ENVPHP') 访问此环境变量...

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多