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

时间:2012-08-14 00:04:10

标签: php database

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

因此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。这很糟糕,因为我们正在使用不正确的数据库。

有没有办法解决这个问题? (就像检查从中拉出的文件的目录一样,而不是检查脚本执行的位置)。或者是否有比实施方法更好的方法解决这个问题?

3 个答案:

答案 0 :(得分:2)

我这样做:

switch (gethostname()) {
  case 'dev-local':
    define('SITE_URL', ....);
    define('TRIM_REQUEST_URI', '');

    require CONFIG . '/VM/database.php';
    break;

    ......
}

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

答案 1 :(得分:1)

如果您知道脚本的相对路径,则可以包含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__方法。)

答案 2 :(得分:0)

您可以使用以下命令指定查找文件的绝对路径 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解析器会知道你在wi ini_set命令中指定的目录。

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