在 PHP 中切换开发数据库的最佳方式


Best way to switch development databases in PHP?

目前,我正在为数据库驱动的网站进行大量更新。

所以在webroot中有一个名为db的文件.php它包含在每个页面中。它具有与 SQL 数据库的连接详细信息。这默认为实时数据库。

我们还有一个名为db.local.php的文件。现在,如果此文件存在,则其中的连接详细信息将覆盖默认值。因此,此文件不会保留在源代码管理下,因为它对于每个设置都是唯一的。

我们通过以下方式检查文件是否存在:

if(file_exists(getcwd().'/db.local.php')) {
    require_once('db.local.php'); 
} else {
//default database details
}

问题是我们从多个文件夹中使用此文件,而不仅仅是 webroot(例如,从 webroot/admin 调用的脚本的 cwd 将是 webroot/admin,而不仅仅是 webroot)。因此,如果从另一个文件夹中的脚本调用 db.php,则当前工作目录将不是 webroot,因此我们不会看到 db.local.php。这很糟糕,因为我们使用了不正确的数据库。

有没有办法解决这个问题?(就像一种检查从中提取的文件目录的方法,而不是脚本从哪里执行的方法)。还是有比已经实施的更好的方法来解决这个问题?

我这样做:

switch (gethostname()) {
  case 'dev-local':
    define('SITE_URL', ....);
    define('TRIM_REQUEST_URI', '');
    require CONFIG . '/VM/database.php';
    break;
    ......
}

每个服务器都有不同的主机名。

你可以包括 db.local.php如果你从脚本中知道它的相对路径。 无论运行脚本时的当前工作目录如何,这都将起作用。 例如,假设您有

/foo/bar/www/db.php
/foo/bar/www/db.local.php
/foo/bar/www/index.php
/foo/bar/scripts/cleanup.php

在 cleanup.php 中,您可以检查并包含 db.local.php如下所示:

$APPROOT = __DIR__ . DIRECTORY_SEPARATOR . '..';
$DBLOCAL = $APPROOT . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'db.local.php';
if(file_exists($DBLOCAL)) {
  require_once($DBLOCAL);
}

如果有很多脚本执行此操作,则可能需要创建一个初始化文件来设置这些变量并将其包含在每个脚本中(使用相同的__DIR__方法)。

您可以使用 set_include_path功能。

http://php.net/manual/en/function.set-include-path.php

<?php
ini_set('include_path', '/usr/lib/pear');
/*
// On Windows: 
ini_set('include_path', 'c:'sites'config');
*/
?>

编辑:然后你可以只使用 require 'db.php';PHP 解析器会知道查找您使用ini_set命令指定的目录。

您还可以将路径添加到php.ini文件...