【问题标题】:Consolidate multiple site files into single location将多个站点文件合并到一个位置
【发布时间】:2010-05-08 11:28:29
【问题描述】:

我们有一个在 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

【问题讨论】:

  • AliasMatch 不会解决文件系统级别的问题(因为 PHP 包含这样的问题),如果我没记错的话,它和符号链接一样不灵活,不是吗?跨度>
  • @Pekka 我们实际上有一个测试站点使用这种配置,因为系统中包含的每个文件都以包含路径为前缀,然后定义如下define('SITE_ROOT','/home/commonfi')
  • 啊,我明白了!这听起来不是很好吗?

标签: php linux apache deployment


【解决方案1】:

您可以通过 Apache 配置进行设置 - 您可能需要 Alias,但有几个选项: http://httpd.apache.org/docs/2.2/urlmapping.html

【讨论】:

  • 我最喜欢这个选项,它是我以前看过的。上面添加了代码来显示这个
【解决方案2】:

您当然可以按照您的描述构建一个“级联”系统(加载本地文件,如果不存在,则加载全局文件)。复杂性在于文件以不同的方式加载(在 PHP 中使用 include(),通过网络,......也许还有更多方式?)

文件系统包括

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

这也许值得一个单独的问题。

【讨论】:

  • 是的,我考虑过这一点,但如果我有一个目录,其中所有文件都需要在除 1 之外的通用文件中(例如),那么我不确定如何处理/可以处理
  • @seengee true,使用符号链接很难处理。嗯。
  • 为目录中的所有文件创建符号链接,而不是目录本身。不是最好的解决方案,但唯一可以“工作”的解决方案。
  • @Matthew - 这是一种选择,但出于显而易见的原因,它确实有点糟糕
  • @seengee 我扩大了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多