Я занимаюсь разработкой мультитенантного приложения SaaS. У каждого арендатора есть своя база данных. Все специфичные для арендатора данные ограничены базой данных арендатора и изолированы от других арендаторов и их данных. У меня есть централизованный словарь метаданных арендаторов с информацией, позволяющей подключаться к базе данных арендаторов.
Каждый арендатор имеет свое уникальное имя пользователя и сможет получить доступ к приложению, используя структуру URL, такую как abc.domain.com/username. Я хотел бы подключиться к базе данных арендаторов в зависимости от имени пользователя в URL.
Вы можете направить весь трафик в один файл php, который обрабатывает все URL
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php/$1 [NC,L]
Затем в index.php вы получите URL-адрес запроса и проанализируете его.
$uri = $_SERVER['REQUEST_URI'];
preg_match('|^/([^/]+)|', $uri, $matches);
$username = $matches[1];
Если бы я делал это таким образом, у меня также была бы центральная база данных с таблицей, состоящей из всех существующих пользователей и соответствующих им имен баз данных. Я бы использовал $ username, чтобы найти соответствующее имя базы данных.
Вы можете переписать URL-адрес, чтобы указать владельца в качестве параметра запроса.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\/]+)/(.*)$ /$2?tenant=$1 [QSA,L]
Это позволит вам подключиться к этой базе данных с
$tenant = filter_input(INPUT_GET, 'tenant', FILTER_SANITIZE_STRING);
$metadata = new PDO('pgsql:host=localhost;port=5432;dbname=meta', $user, $pass);
$tenantdata = new PDO('mysql:host=localhost;dbname=test', $tenant,
$_SESSION['tenantpass']);
$tenantdata->prepare('SELECT foo FROM bar');
...