Single instalation with, multiple databases
I don't think this is possible out of the box. Magento supports master/slave database configuration, but you have to have them for all the stores.
And I don't think this can be done easily with custom coding since the stores are kept in the database.
So depending on the store view you need to know which database to connect to, but in order to know the store view, you need to query a database. So you run around in circles.
You want to have several separate stores with their own databases using single codebase?
Well, there's no simple and recommended way to do that. That being said we can see what CAN be done:
Database information comes from a single xml file: app/etc/local.xml This file is being loaded from app/Mage.php so if you change that file you can theoretically decide which configuration file you're going to load (based on desired condition, such as domain name). Voila, different domain, different database. Now comes the Bad News Part(tm).
- You're overwriting core code and so called "god class" at that. This is considered a VERY BAD practice in Magento world! Every time you upgrade your changes will be overwritten.
- Content overlapping. Not all your content is stored in database, there's also media folder and there's session folder (var/session) you either need to find a workaround for (for example custom paths based on database) or store both images and sessions in the database (before you ask: yeah, this is possible).
- Cache. You most certainly don't want you different stores share cache folder (var/cache). Fortunately it's possible to use external caches, such as memcached instead of storing files to that folder. Still you must make sure that your cache ID-s won't overlap, because if they do, you're going to be in the world of hurt.
- You can't use compilation (the feature is deprecated anyway).
- Maybe something else I'm forgetting. Anyone?
Great answer slarek. We did something very similar. Instead of editing index.php we setup separate folders outside of magento's codebase, and include mage.php from those folders, and then edit the etc_dir (and other dirs) like in your method above.
folder structure:
/www/client1
/www/client2
/www/client3
/www/clientX
/www/magento
Inside each of the client folders are:
- /www/clientx/etc/local.xml (with unique database defined, and unique redis db)
- /www/clientx/etc/modules (this is a sym link to /www/magento/app/etc/modules)
- /www/clientx/index.php
in /www/clientx/index.php
define('MAGENTO_ROOT', '/www/magento');
...(rest of index.php is business as usual)...
$client = isset($_SERVER['CLIENT_ID']) ? $_SERVER['CLIENT_ID'] : '';]
Mage::run($mageRunCode, $mageRunType, array('etc_dir'=>'../'.$client));
We set
$_SERVER['CLIENT_ID'] in Nginx with
`fastcgi_param CLIENT_ID clientx; `