什么是在PHP中确定脚本所在服务器和配置的最佳方法?

3

我正在尝试确定PHP脚本确定其所在的服务器的最佳方法。

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

这意味着我可以将网站轻松地放置在任何配置过的服务器上,无需更改任何代码(特别是配置)。如果是新服务器,则只需添加一个新的case,然后从那时起就可以使用了。

我们已经按照相同的SERVER_NAME: SERVER_PORT组合加载配置文件,但发现这是另一个需要维护的文件,并且我们不确定解析ini文件的速度(尽管为每个服务器添加额外的case可能会同样慢)。

我们还面临另一个问题,即当网站经常在2个服务器之间移动时,但我们在每个服务器上都使用相同的SERVER_NAMESERVER_PORT。这意味着我们需要暂时注释一个case并确保它不进入repo。

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

8个回答

2

如何使用$_SERVER['SERVER_ADDR']并以服务器的IP地址为基础来确定身份。

更新:在虚拟主机的情况下,您可能还想将IP与文档根路径连接起来,像这样:

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

因为我们经常使用共享服务器,有时候不使用SSL,所以同一个服务器上可能会有多个相同的网站,因此IP地址也相同。 - Darryl Hein
也许在这种情况下,您将不得不将服务器IP或主机名与文档根路径相结合。希望这对您来说足够独特。 - Adam Pierce

2

以下是您可以检查的一些变量:

$_SERVER['HTTP_HOST'];

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

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

我在命令行运行时会使用这两个变量之一。其中一个变量总能解析为可用的用户名。在控制台模式下似乎没有其他定义主机的变量。
这可能对你不够有帮助;如果你发现仍然难以唯一地识别你所在的服务器,你可以稍微“推”一下它。在我的情况下,我有一个小的配置文件,每个服务器都是唯一的,基本上设置了一个定义我正在运行的“环境”的php变量(例如,“开发”或“生产”)。这样,你只需要维护一个小的、易于重新创建的文件,而不需要放在源代码控制之外。

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等。更高效,但灵活性稍低。

1

我一直在使用以下机制:

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

我的开发环境具有相当独特的路径结构,因此这很有效,我不需要担心如果添加了其他域到$_SERVER[HTTP_HOST],或者客户端提供了不正确的HTTP_HOST值(尽管这很少见...)。


1

我一直在我的网站上保留一个config.php文件,存储可能特定于该服务器的信息。

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

0
$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'];

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

0
为什么不将每个主机的配置文件存储在项目目录之外,并从php代码中读取呢?
具有特定于主机的代码并不是一个好的实践。

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