我应该如何组织我的网站以使用共享包?让我们以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
我问,因为我在网站上设置了几个独立的工具。我计划将每个工具放在同一服务器上的自己的子域中。每当我更新许多子域使用的包时,我只想在一个地方更新服务器,所以我希望它存储在自己的命名空间中。
我应该使用像作曲家这样的依赖管理器来处理这个问题吗?实现这一目标的最佳实践方法是什么?
答案 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是一个非常棒的东西,特别是在使用第三方代码时。