0

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

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

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

4

3 回答 3

2

我这样做:

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

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

    ......
}

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

于 2012-08-14T00:12:23.103 回答
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__方法。)

于 2012-08-14T00:23:12.357 回答
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文件...

于 2012-08-14T00:08:49.690 回答