Php 将多个站点文件合并到单个位置

Php 将多个站点文件合并到单个位置,php,linux,apache,deployment,Php,Linux,Apache,Deployment,我们有一个在Linux/Apache上运行的定制PHP/MySQL CMS,它在同一台服务器上的多个站点(20+)上推出。每个站点都使用完全相同的CMS文件,每个站点都有几个文件是定制的 每个站点的自定义文件包括: /library/mysql\u connect.php /public_html/css/* /公共\u html/ftparea/* /公共_html/images/* /public\u html/includes/中还有一些其他随机文件,它们是每个站点所独有的。除此之外,服务

我们有一个在Linux/Apache上运行的定制PHP/MySQL CMS,它在同一台服务器上的多个站点(20+)上推出。每个站点都使用完全相同的CMS文件,每个站点都有几个文件是定制的

每个站点的自定义文件包括:

/library/mysql\u connect.php
/public_html/css/*
/公共\u html/ftparea/*
/公共_html/images/*

/public\u html/includes/
中还有一些其他随机文件,它们是每个站点所独有的。除此之外,服务器上的每个站点都使用完全相同的文件。位于
/home/username/
内的每个站点。这里显然有大量的复制,因为每次我们想要部署系统更新时,我们都需要更新到每个用户帐户。鉴于公共站点文件都存储在SVN中,如果我们能够简单地提交给SVN并直接从SVN部署到单个位置,这将更有意义。不幸的是,在这个阶段进行重大架构更改可能会有问题。在我看来,理想的情况是创建一个像
/home/commonfiles/
这样的帐户,每个站点都使用这些公共文件,除非存在特定于帐户的文件,例如,向
/home/user/public\u html/index.php
发出请求,但由于该文件不存在,请求随后被重定向到
/home/commonfiles/public\u html/index.php
。我知道通常这种方法是可行的,类似于Zend Framework(可能还有其他人)如何将所有与特定文件不匹配的请求重定向到index.php。我只是不确定如何确切地实施它,以及它是否真正可取。非常欢迎人们提出任何意见/想法

EDITAllenJB的评论提醒我,我们之前曾将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
您当然可以按照您所描述的构建“级联”系统(加载本地文件,如果不存在,则加载全局文件)。复杂的是,文件以不同的方式加载(在PHP中使用include(),通过web,…可能还有更多的方式?)

文件系统包括

如果
包含/
文件,每个文件包含一个PHP类,那么您可以像Zend Framework一样使用自动加载程序。自动加载程序将首先查找包含文件的自定义版本,如果找不到,则包含全局版本。我碰巧有这样一个自动加载器手边,如果你需要代码开始

如果include与每个文件结构一个类不匹配,则必须构建一个自定义的
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)。我认为使用
.htaccess
文件中的
-f
开关应该可以很容易地解决这个问题。您将构建一个规则,将失败的请求(
!-f
)重写到本地web资源目录(
example.com/css/main_stylesheet.css
)到全局目录(
/home/commonfiles/public_html/main_stylesheet.css
)。您需要摆弄Apache的服务器配置,以便能够将本地请求重写到commonfiles目录,但这应该是可能的


这可能值得一个单独的问题。

您可以通过Apache配置进行设置-您可能需要Alias,但有几个选项:

是的,我考虑过这一点,但如果我有一个目录,其中包含除1(例如)之外的所有需要在公共文件中的文件,那么我不确定这会是什么情况handled@seengee诚然,使用符号链接很难处理这一问题。为目录中的所有文件创建符号链接,而不是目录本身。这不是最好的解决方案,但却是唯一一个“有效”的方案。@Matthew-这是一个选择,但对于显而易见的问题来说,它确实有点糟糕reasons@seengee我把我的答案扩大了一点。我最喜欢这个选项,它是我以前看过的。上面添加的代码表明,thisAliasMatch并不能解决文件系统级别的问题(因为PHP包含这样的代码),如果我没有弄错的话,它就像符号链接一样不灵活,不是吗?@Pekka我们实际上有一个测试站点使用大致相同的配置,实际上系统中包含的每个文件都有一个包含路径前缀,该路径定义如下
define('site_ROOT','/home/commonfi')
ah,我明白了!听起来不错吧?