如何在网站上组织共享代码奖励:跨子域

时间:2014-01-14 22:26:05

标签: php apache namespaces dependencies subdomain

我应该如何组织我的网站以使用共享包?让我们以Stackexchange为例。有许多子域名:

webapps.stackexchange.com         namespace StackExchange\webapps
programmers.stackexchange.com     namespace StackExchange\programmers
etc.

每个子域都重用库。也许有一个问题类被所有网站重用,以帮助布局问题页面。

问题包是否会打包在每个子域包中?或者所有包都引用问题包。换句话说:情况是这样的:

StackExchange\webapps\question
StackExchange\programmers\question

OR:

StackExchange\webapps
StackExchange\programmers
StackExchange\question
WHERE StackExchange\Webapps and StackExchange\programmers use StackExchange\question

我问,因为我在网站上设置了几个独立的工具。我计划将每个工具放在同一服务器上的自己的子域中。每当我更新许多子域使用的包时,我只想在一个地方更新服务器,所以我希望它存储在自己的命名空间中。

我应该使用像作曲家这样的依赖管理器来处理这个问题吗?实现这一目标的最佳实践方法是什么?

2 个答案:

答案 0 :(得分:1)

因为一切都将在同一台服务器上,所以你可以在php.ini的include路径中拥有一个共享目录---

即。

/usr/share/php/

然后,每个项目都可以包含相同的文件 - (一个编写良好的自动加载器函数也可以这样做,而不需要包含路径)

并在为项目特定目的设置包含路径时 -

ini_set('include_path', get_include_path().".:/var/www/path/for/this/project");

或者甚至只是根据需要包含您需要的东西:

require_once '/usr/share/php/apis/Google_Client.php';

答案 1 :(得分:1)

我不得不处理类似的情况,我有两个共享很多功能的网站。因为我必须重写其中一个,所以我尝试建立共享代码库。

命名空间

如何构建命名空间主要是为了品味。

就个人而言,我使用Vendor\Package表示共享内容,Vendor\Site\Package表示特定于网站的代码。

想要做的是在每个特定于网站的软件包中放置一个共享软件包(如第一个暗示的那样),因为这样你就不得不复制修改你的代码文件(因为你必须更改命名空间)。

放置共享包的位置

您可以通过两种方式实际放置共享包:每个应用程序(子域)本地或服务器上的全局。

全球套餐

在这里,您可以在服务器上的某个位置放置共享代码,每个应用程序都可以访问它。 rm-vanda's answer几乎描述了如何在实践中做到这一点。你不需要Composer。

在专业方面,您只有一个共享包实例而不是多个副本。您不能忘记更新其中一个应用程序。如果您使用像APC或OpCache这样的PHP加速器,这种方法也会节省一些内存,因为共享库只能访问缓存一次。

本地包

另一种方法是为每个应用程序提供一份副本。这就是Composer默认追求的方法。通常,您在应用程序的主目录中有一个“供应商”目录,您可以在其中放置此共享内容(如果您使用任何内容,还可以使用第三方代码)。这样,每个应用程序都可以使用不同版本的共享库。

就个人而言,我最喜欢当地的做法。我可以接受额外的部署工作,我认为这是最安全的方式。

  • 必须在多台服务器上拆分我的应用程序吗?没问题,他们已经非常独立了。
  • 应用程序数量正在增长,如果我更新某些内容,我总是无法一直检查所有应用程序?只是不要更新所有这些。
  • 我甚至可以在同一台服务器上拥有一个生产环境和测试环境,其中包含不同版本的共享库。

此外,使用Composer感觉这种方法最自然。而Composer是一个非常棒的东西,特别是在使用第三方代码时。