Codeigniter的应用程序架构 - 多域,单代码库,多个数据库

时间:2010-01-22 05:33:16

标签: architecture codeigniter

我开发了一个网站,其想法是为多个网站使用单个代码库,每个网站都有自己的数据库。目前有一个是现场直播,有许多(最多100个)可以关注。

我的问题是关于管理这种架构的理想,最佳实践方式(不一定是最简单或最现实的,但我可以从中回归的理想)。

对于代码库,我已经完成了整个安装codeigniter和相关代码的路线,并且所有与站点相关的配置都在一组配置文件中,这些配置文件获取主机名并使用它来定义站点标题,跟踪代码,css / js目录等。这似乎是一个很好的设置,我可以看到它适用于大量相同代码的网站。

对于数据库,当架构随开发变化时,如何管理多个数据库?您是否会根据需要手动将更改推送到数据库或使用自动工具? Codeigniter here有一个像Rails一样的迁移插件,这似乎是一个好主意。

3 个答案:

答案 0 :(得分:4)

本文应该向您展示如何做到这一点。它非常简单,工作正常。

How to: Multi-site CodeIgniter Setup

答案 1 :(得分:1)

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

这被称为“Multitenancy”;你应该能够找到很多建筑建议。

我自己并没有做过很多这样的事情,这绝对不是一件轻而易举的事。这很像安全性 - 你不能把它作为一个想法加入,如果你想要最佳实践,你必须在编写一行代码之前将它烘焙到设计中。

毋庸置疑,代码库本身只是整体解决方案的一部分:变更管理将要困难几个数量级。

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

答案 2 :(得分:1)

我最近有过类似的情况。我想让几个目录都运行相同的应用程序,但使用不同的数据库。我是这样做的:

首先我创建了一些空的子目录。对于此示例,我们将其称为/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_path$application_folder变量更改为指向/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_href。我们将通过对主/application/config/config.php文件的简单更改来完成此操作。将$config['base_url']文件中的/application/config/config.php行替换为:

$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_url']设置为相应的子目录(如果不在子目录中,则设置为根目录)。

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

最后一块拼图让我们的应用程序知道要使用哪个数据库。在我的情况下,我希望每个子目录使用自己的数据库。为此,我们将使用我们在SITE文件中创建的config.php常量。

在我们的/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_2][subdir_3]的其他套装。现在我们需要告诉我们的应用程序使用哪些数据库设置。为此,我们获取SITE常量,因此/application/config/database.php文件中的最后一行是:

$active_group = (defined('SITE') && array_key_exists(SITE, $db)) ? SITE : 'default';

以上行设置活动数据库设置组以匹配子目录。

就是这样:)希望这有助于某人。