我们有一个在Linux / Apache上运行的自定义PHP / MySQL CMS,可以在同一台服务器上推广到多个站点(20+)。每个站点使用完全相同的CMS文件,每个站点都有一些文件。
每个站点的自定义文件是:
/library/mysql_connect.php
/的public_html / CSS / *
/的public_html / ftparea / *
/ public_html / images / *
/public_html/includes/
中还有一些其他随机文件对每个网站都是唯一的。除此之外,服务器上的每个站点都使用完全相同的文件。每个网站都位于/home/username/
内。这里显然有大量的复制,因为每次我们想要部署系统更新时,我们需要更新到每个用户帐户。鉴于常见的站点文件都存储在SVN中,如果我们能够简单地提交SVN并从那里直接部署到单个位置,那将更有意义。不幸的是,在这个阶段进行重大架构改变可能会有问题。在我看来,理想情况意味着创建一个帐户,如/home/commonfiles/
和每个网站使用这些公共文件,除非存在特定于帐户的文件,例如向/home/user/public_html/index.php
发出请求,但由于此文件不存在,然后请求被重定向到/home/commonfiles/public_html/index.php
。我知道通常这种方法是可行的,类似于Zend Framework(可能还有其他人)将所有不匹配特定文件的请求重定向到index.php。我只是不确定如何实施它以及它是否真的可行。非常欢迎人们提出的任何意见/想法。
编辑 AllenJB的评论提醒我,我们之前已经将AliasMatch作为一种潜在的解决方案进行了探索,我们最终得到了一个general.conf文件,用户看起来像这样:
php_admin_value open_basedir "/home/commonfi:/home/usertes:/usr/lib/php:/usr/local/lib/php:/tmp"
php_admin_value include_path "/home/commonfi"
AliasMatch (.*).php /home/commonfi/public_html/$1.php
AliasMatch (.*).html /home/commonfi/public_html/$1.html
答案 0 :(得分:1)
您当然可以构建一个“级联”系统,如您所述(加载本地文件,如果不存在,则加载全局文件)。复杂性是文件以不同的方式加载(在PHP中使用include(),通过Web,......可能更多的方式?)
文件系统包括
如果includes/
包含每个包含一个PHP类的文件,您可以使用像Zend Framework那样的自动加载器。自动加载器首先查找包含文件的自定义版本,如果找不到,则包含全局版本。如果你需要代码,我碰巧有这样的自动加载器。
如果包含与每个文件一个类的结构不匹配,则必须构建一个自定义include()
函数来获取文件的本地版本,否则就会获取全局文件。
的伪代码:
function fetch_path($name)
{
if (file_exists(LOCAL_DIRECTORY."/$name")) return LOCAL_DIRECTORY."/$name";
if (file_exists(GLOBAL_DIRECTORY."/$name")) return GLOBAL_DIRECTORY."/$name";
return false;
}
网络资源
第二部分将成为Web部分(即具有本地或全局文件的Web URL)。我认为使用-f
文件中的.htaccess
开关可以很容易地解决这个问题。您将构建一个规则,将失败的请求(!-f
)重写到本地Web资源目录(example.com/css/main_stylesheet.css
)到全局的/home/commonfiles/public_html/main_stylesheet.css
)。您需要摆弄Apache的服务器配置,以便能够将本地请求重写到commonfiles目录,但它应该是可能的。
这可能值得一个单独的问题。
答案 1 :(得分:1)
您可以通过Apache配置进行设置 - 您可能需要Alias,但有几个选项: http://httpd.apache.org/docs/2.2/urlmapping.html