2012-08-14 67 views
0

目前我正在为数据库驱动的网站进行大量更新。在PHP中切换开发数据库的最佳方式?

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

我们还有一个名为db.local.php的文件。现在,如果此文件存在,则会覆盖默认值中的连接详细信息。因此,这个文件不会保存在源代码控制之下,因为它对每个设置都是独一无二的。

我们检查文件是否存在通过去:

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

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

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

+0

您是否预见到需要在目录结构中移动文件?是不是有一个原因,你不能只是做'包括'../ db.local.php';'? – 2012-08-14 00:09:07

+0

这会工作,但如果db.local.php不存在,我们有一个问题。我明白你的意思了。 – penguin 2012-11-03 16:04:48

+0

我猜,这样做会起作用,但是我需要在每个包含它的文件中执行此操作,而该文件包含来自任何目录的文件,如果存在该条件测试(如果存在)可能需要很多工作。 所以我现在有一个名为db.php.sample文件,与该文件的结构,但没有实际的密码,星展银行等,这是下混帐保持。 db.php中也没有了,有一个在一个的.gitignore忽略。这样我可以推送更改并且db文件不受影响。我发现这是最简单的方法。感谢大家的建议;他们都非常有帮助! – penguin 2012-11-03 16:08:54

回答

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解析器会知道在您指定的目录瓦特/的ini_set命令查找。

您也可以在路径添加到您的php.ini文件...

+0

在每一个文件设置一个绝对路径是一个非常糟糕的主意。 – 2012-08-14 00:10:21

+0

然后把它添加到你的php.ini文件... – blad 2012-08-14 00:11:50

+0

如果你在多个站点的工作在同一台服务器上,会发生什么? – 2012-08-14 00:13:34

2

我这样做:

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

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

    ...... 
} 

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

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__方法。)

相关问题