Cakephp3应用程序子域共享相同的应用程序代码但不同的数据库

时间:2016-02-19 19:49:54

标签: php cakephp cakephp-3.0 multi-tenant

我想用CakePHP 3构建多租户Web应用程序,就像这个http://www.orangescrum.com/一样,也是用CakePHP编写的。

每个租户都有单独的子域和单独的数据库,只有应用程序源代码对所有子域都相同。这些域将拥有自己的文件夹,例如x.domain.comy.domain.com映射到文件夹x, y, z

我不想在所有子域中都有重复的应用程序源代码。我想为所有人重用相同的应用程序代码。

当请求每个子域时,我如何使用相同的应用程序代码但不同的数据库?欢迎任何有关任何实施的建议。

1 个答案:

答案 0 :(得分:1)

您必须为此创建一个conf文件。

您可以使用sh文件自动创建,如下所示

#!/bin/bash

if [ "x${1}" = "x" ]; then
    echo "User is not specified"
    exit 1
fi

if [ "x${2}" = "x" ]; then
    echo "Domain is not specified"
    exit 1
fi

if [ "x${3}" = "x" ]; then
    echo "Domain is not specified"
    exit 1
fi

/bin/echo ${1}${2} | /bin/egrep -q ';|`|\||>'
if [ $? -eq 0 ]; then
    echo "Bad parameter"
    exit 1
fi

/bin/cat > /etc/httpd/vhost.d/${1}.${2}.conf <<EOF
<VirtualHost *:80>
DocumentRoot /home/user/www.${2}/htdocs
ServerName ${1}.${2}
ServerAlias ${3}
ServerAdmin adminemail@example.com
</VirtualHost>


<VirtualHost *:443>
DocumentRoot /home/user/www.${2}/htdocs
ServerName ${1}.${2}
ServerAlias ${3}
ServerAdmin adminemail@example.com
SSLEngine on
SSLCertificateFile /etc/httpd/conf/ssl.crt/example.com.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/example.key
SSLCACertificateFile /etc/httpd/conf/ssl.crt/example.crt
</VirtualHost>


EOF

service httpd restart

echo "Vhost has been added"  

exit 0

指定的路径和电子邮件可以根据您的配置进行修改,并使用 vhost_gen.sh 保存在&#39; / usr / local / bin /&#39; 或者你喜欢的任何地方。

在cakephp中调用这个sh文件

$subdomain_name = 'xyz';
$domain_name = 'domain.com';
$real_domain_name = 'xyz.domain.com';

exec ("/usr/local/bin/vhost_gen.sh ".$subdomain_name." ".
$domain_name." ".$real_domain_name);

$ real_domain_name是ServerAlias,如果您想将任何真实域作为该子域的别名。