2 Stimmen

Anwendungsarchitektur für Codeigniter - mehrere Domänen, eine Codebasis, mehrere Datenbanken

Ich habe eine Website mit der Idee entwickelt, eine einzige Codebasis für mehrere Websites zu verwenden, die jeweils ihre eigene DB haben. Derzeit ist eine live, mit vielen (bis zu 100) zu folgen.

Meine Frage bezieht sich auf die ideale, am besten geeignete Art und Weise der Verwaltung dieser Art von Architektur (nicht unbedingt die einfachste oder realistischste, aber die ideale, von der ich ausgehen kann).

Für die Codebasis bin ich den Weg gegangen, das Ganze zu einer Installation von Codeigniter und zugehörigem Code zu machen, und alle seitenbezogenen Konfigurationen befinden sich in einer Reihe von Konfigurationsdateien, die den Hostnamen aufnehmen und diesen verwenden, um den Seitentitel, den Tracking-Code, die Css/Js-Verzeichnisse usw. zu definieren. Dies scheint ein gutes Setup zu sein und ich kann mir vorstellen, dass es für eine große Anzahl von Websites mit demselben Code funktioniert.

Wie würde man mehrere Datenbanken verwalten, wenn sich das Schema mit der Entwicklung ändert? Würden Sie die Änderungen je nach Bedarf manuell in die Datenbanken übertragen oder ein automatisches Tool verwenden? Es gibt ein Rails-ähnliches Migrations-Plugin für Codeigniter ici scheint das eine gute Idee zu sein.

4voto

Phil Sturgeon Punkte 30202

Dieser Artikel soll Ihnen genau zeigen, wie Sie das machen können. Es ist wirklich einfach und funktioniert gut.

Wie man: CodeIgniter-Einrichtung für mehrere Standorte

0 Stimmen

Hallo Phil - ja, das ist es - ich las dies vor etwa einem Monat, als ich es einrichtete, und ich denke, das ist der Weg für den Code zu gehen, war ein wirklich hilfreicher Beitrag, danke. Ich denke, meine Hauptschwierigkeit wird sein, die DB-Verwaltung richtig zu machen. Ich erwarte, dass sich das Datenbankschema im Laufe der Entwicklung ändern wird und möchte sicherstellen, dass ich einen soliden Prozess zur Verwaltung der Aktualisierungen habe.

0 Stimmen

Verwenden Sie Migrationen, damit die Schemaänderungen reibungslos funktionieren github.com/philsturgeon/codeigniter-migrationen

1voto

Adrian K Punkte 9509

Wenn ich Sie richtig verstehe, haben Sie mehrere logische Websites, die über eine einzige physische Instanz des Codes laufen, aber jede Site hat ihre eigene Datenbank.

Dies ist bekannt als Mehrmandantenfähigkeit '; und Sie sollten in der Lage sein, eine Menge architektonischer Ratschläge dafür zu finden.

Ich habe selbst noch nicht viel damit zu tun, und es ist definitiv nicht trivial. Es ist ähnlich wie mit der Sicherheit - man kann sie nicht nachträglich einbauen, sondern muss sie in das Design einbauen, bevor man eine Zeile Code schreibt, wenn man die beste Praxis will.

Es versteht sich von selbst, dass die Code-Basis selbst nur ein Teil der Gesamtlösung ist: Das Änderungsmanagement wird um Größenordnungen schwieriger sein.

Es tut mir leid, dass ich keine genauere Hilfe anbieten kann.

1voto

Brett DeWoody Punkte 55398

Ich hatte kürzlich eine ähnliche Situation. Ich wollte mehrere Verzeichnisse haben, die alle dieselbe Anwendung ausführen, aber unterschiedliche Datenbanken verwenden. So habe ich es gemacht:

Zuerst habe ich einige leere Unterverzeichnisse erstellt. Für dieses Beispiel nennen wir sie /subdir_1 , /subdir_2 y /subdir_3 .

In jedem dieser Verzeichnisse habe ich eine Kopie der CodeIgniter index.php-Datei erstellt und in jedem Verzeichnis abgelegt. Meine Dateistruktur sieht nun etwa so aus:

/application
/system
/subdir_1
     index.php
/subdir_2
     index.php
/subdir_3
     index.php

Dies könnte auch mit einigen .htaccess-Regeln erreicht werden, aber das ist eine ganz andere Geschichte.

In jeder der index.php-Dateien habe ich die $system_path y $application_folder Variablen, die auf den /application y /system Verzeichnisse. In meinem speziellen Fall habe ich meine index.php-Datei geändert:

/*
*---------------------------------------------------------------
* 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";

Wenn Sie nun eines der Unterverzeichnisse aufrufen, sollte Ihre Anwendung angezeigt werden.

Von hier aus müssen wir die base_href für jedes Verzeichnis. Wir werden dies mit einer einfachen Änderung der Haupt /application/config/config.php Datei. Ersetzen Sie die $config['base_url'] Zeile in Ihrem /application/config/config.php Datei mit:

$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]);
}

Das obige Snippet setzt die $config['base_url'] in das entsprechende Unterverzeichnis (oder das Stammverzeichnis, wenn es sich nicht in einem Unterverzeichnis befindet).

El define('SITE', $pieces[1]) Zeile erzeugt eine Konstante, auf die wir in unserer gesamten Anwendung zugreifen können, um zu wissen, in welchem Unterverzeichnis wir uns befinden.

Das letzte Teil des Puzzles ist es, unserer Anwendung mitzuteilen, welche Datenbank sie verwenden soll. In meinem Fall wollte ich, dass jedes Unterverzeichnis seine eigene Datenbank verwendet. Dazu verwenden wir die SITE Konstante, die wir in der config.php Datei.

In unserem /application/config/database.php Datei werden wir einige alternative Datenbankeinstellungen hinzufügen. Zu diesem Zweck kopieren wir die Datei [default] Datenbankverbindungseinstellungen und richten alternative Einstellungen für jede unserer Subdomains ein. So sieht einer meiner Sätze aus:

$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;

Ich habe weitere Sets für [subdir_2] y [subdir_3] . Nun müssen wir unserer Anwendung mitteilen, welche Datenbankeinstellungen sie verwenden soll. Um dies zu tun, greifen wir auf die SITE Konstante, so dass die letzte Zeile in unserer /application/config/database.php Datei ist:

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

In der obigen Zeile wird die aktive Datenbankeinstellungsgruppe auf das Unterverzeichnis abgestimmt.

Und das war's :) Hoffentlich hilft das jemandem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X