Architecture Codeigniter的应用程序体系结构-多域、单代码库、多数据库

Architecture Codeigniter的应用程序体系结构-多域、单代码库、多数据库,architecture,codeigniter,Architecture,Codeigniter,我开发了一个网站,其想法是为多个站点使用一个代码库,每个站点都有自己的数据库。目前有一个是实时的,还有很多(最多100个)要跟进 我的问题是关于管理这种体系结构的理想的、最佳实践的方法(不一定是最简单或最现实的方法,而是我可以从中回溯的理想方法) 对于代码库,我一直在进行一次codeigniter和相关代码的安装,所有与站点相关的配置都在一组配置文件中,这些配置文件提取主机名并使用它定义站点标题、跟踪代码、,css/js目录等。这似乎是一个很好的设置,我可以看到它适用于大量相同代码的站点 对于数

我开发了一个网站,其想法是为多个站点使用一个代码库,每个站点都有自己的数据库。目前有一个是实时的,还有很多(最多100个)要跟进

我的问题是关于管理这种体系结构的理想的、最佳实践的方法(不一定是最简单或最现实的方法,而是我可以从中回溯的理想方法)

对于代码库,我一直在进行一次codeigniter和相关代码的安装,所有与站点相关的配置都在一组配置文件中,这些配置文件提取主机名并使用它定义站点标题、跟踪代码、,css/js目录等。这似乎是一个很好的设置,我可以看到它适用于大量相同代码的站点


对于数据库,当模式随着开发而改变时,如何管理多个数据库?您是根据需要手动将更改推送到数据库,还是使用自动工具?Codeigniter有一个类似Rails的迁移插件,这似乎是一个好主意。

如果我理解正确,您有多个逻辑网站运行一个物理实例的代码,但每个网站都有自己的数据库

这被称为“”;你应该能找到很多关于这方面的架构建议

我自己没有做过很多,这绝对不是小事。这很像安全性——你不能把它当作事后考虑的东西,如果你想得到最佳实践,你必须在写一行代码之前把它加入到设计中

不用说,代码库本身只是整个解决方案的一部分:变更管理将要困难几个数量级


很抱歉,我无法提供更具体的帮助。

这篇文章应该向您展示如何做到这一点。这真的很简单,效果很好


我最近也遇到了类似的情况。我希望有几个目录都运行相同的应用程序,但使用不同的数据库。我是这样做的:

首先,我创建了一些空的子目录。对于本例,我们将它们称为
/subdir_1
/subdir_2
/subdir_3

在每个目录中,我复制了CodeIgniter index.php文件,并将其放在每个目录中。我的文件结构现在看起来像:

/application
/system
/subdir_1
     index.php
/subdir_2
     index.php
/subdir_3
     index.php
这也可以通过一些.htaccess规则来实现,但这完全是另一回事

在每个index.php文件中,我已将
$system\u路径
$application\u文件夹
变量更改为指向
/application
/system
目录。对于我的特殊情况,我将index.php文件更改为:

/*
*---------------------------------------------------------------
* SYSTEM FOLDER NAME
*---------------------------------------------------------------
*
* This variable must contain the name of your "system" folder.
* Include the path if the folder is not in the same  directory
* as this file.
*
*/
    $system_path = "../system";

/*
*---------------------------------------------------------------
* APPLICATION FOLDER NAME
*---------------------------------------------------------------
*
* If you want this front controller to use a different "application"
* folder then the default one you can set its name here. The folder
* can also be renamed or relocated anywhere on your server.  If
* you do, use a full server path. For more info please see the user guide:
* http://codeigniter.com/user_guide/general/managing_apps.html
*
* NO TRAILING SLASH!
*
*/
    $application_folder = "../application";
此时,点击任何子目录都会显示您的应用程序

从这里我们需要为每个目录设置
base\u href
。我们将通过对主
/application/config/config.php
文件的简单更改来实现这一点。将
/application/config/config.php
文件中的
$config['base\u url']
行替换为:

$uri = $_SERVER['REQUEST_URI'];
$pieces = explode('/', $uri);

if ($pieces[1] == 'index.php') {
    $config['base_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/';
    define('SITE', 'default');
} else {
    $config['base_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $pieces[1] . '/';
    define('SITE', $pieces[1]);
}
上面的代码片段将
$config['base\u url']
设置到相应的子目录(如果不在子目录中,则设置为根目录)

define('SITE',$pieces[1])
行创建了一个常量,我们可以在整个应用程序中访问该常量,以了解我们所在的子目录

谜题的最后一部分是让我们的应用程序知道使用哪个数据库。在我的例子中,我希望每个子目录使用自己的数据库。为此,我们将使用在
config.php
文件中创建的
SITE
常量

在我们的
/application/config/database.php文件中,我们将添加一些备用数据库设置。为此,我们复制
[default]
数据库连接设置,并为每个子域设置备用设置。以下是我的一套服装的外观:

$db['subdir_1']['hostname'] = "localhost";
$db['subdir_1']['username'] = "[USERNAME]";
$db['subdir_1']['password'] = "[PASSWORD]";
$db['subdir_1']['database'] = "[DATABASE]";
$db['subdir_1']['dbdriver'] = 'mysql';
$db['subdir_1']['dbprefix'] = '';
$db['subdir_1']['pconnect'] = TRUE;
$db['subdir_1']['db_debug'] = TRUE;
$db['subdir_1']['cache_on'] = FALSE;
$db['subdir_1']['cachedir'] = '';
$db['subdir_1']['char_set'] = 'utf8';
$db['subdir_1']['dbcollat'] = 'utf8_general_ci';
$db['subdir_1']['swap_pre'] = '';
$db['subdir_1']['autoinit'] = TRUE;
$db['subdir_1']['stricton'] = FALSE;
我还有其他的
[subdir\u 2]
[subdir\u 3]
的设置。现在,我们需要告诉应用程序要使用哪些数据库设置。为此,我们获取
SITE
常量,因此
/application/config/database.php
文件中的最后一行是:

$active_group = (defined('SITE') && array_key_exists(SITE, $db)) ? SITE : 'default';
上行将active database设置组设置为与子目录匹配


就是这样:)希望这能帮助别人。

嗨,菲尔-是的,就是这样-我大约一个月前在设置它的时候读到了这篇文章,我认为这就是代码的方法,这是一篇非常有用的帖子,谢谢。我认为我的主要困难是如何正确地管理数据库。我希望数据库模式会随着开发的进展而变化,并希望确保我有一个可靠的流程来管理更新。使用迁移可以使模式变化正常工作