所有这些应用程序都有自己的数据库我想保持这种方式.但是,我相信如果共享一些代码会很好.以vendor和src目录为例.它在每个应用程序中都是相同的,但是所有这些都在OpCache中单独“加载”.我相信,从资源的角度来看,最好是共享这些目录.
Composer和Symfony似乎都不支持具有共享目录的多实例应用程序.我想知道是否有人有任何线索来实现我的想法或我的计划是不可行的?
每个应用程序(parameters.yml)的配置不同,并且web目录包含每个应用程序的不同样式表.所以他们需要与其他人分开.
我一直在考虑使用环境设置,但是我们感觉环境“test”,“dev”,“application1”,“application2”等等.对于config_prod.yml突然也变得无法使用了.
我的思维方式错了吗?有关如何实现这一目标的任何建议?或者我应该选择一个完整的单独实例?
(我们的应用程序正在使用SemVer,如果我们有1.0.0版本的共享代码,版本1.1.0等,它甚至会很好.所以这甚至是下一层.但也许这是下一步.)
编辑:
澄清一点;
从本质上讲,您可以说web目录和var目录都是不可共享的. Web目录包含自定义样式表,是主要入口点. var目录包含缓存文件,每个应用程序的缓存文件不同,具体取决于其数据库设置.
最后,您还拥有自定义参数文件,该文件与存储数据库凭据的应用程序不同.
我尝试过symlinking,但作曲家对此并不满意.此外,使用符号链接时,工作目录始终是实际使用的目录,而不是您符号链接的实际目录.
我还尝试了应用程序的vhost文件中的自定义设置.可以覆盖缓存和内核目录,但是再次松开了您正在进行符号链接的实际目录.
解决方法
首先,更新您的前端控制器以获得新的超级全局.可能有更好的方法来做到这一点,我建议调查一下..
// web/app.PHP use Symfony\Component\HttpFoundation\Request; /** @var \Composer\Autoload\ClassLoader $loader */ $loader = require __DIR__.'/../app/autoload.PHP'; include_once __DIR__.'/../var/bootstrap.PHP.cache'; list($scheme,$host) = explode('.',$_SERVER['SERVER_NAME']); define(APP_CONfig_FILENAME,sprintf('%s.yml',$host)); $kernel = new AppKernel('prod',false); $kernel->loadClassCache(); //$kernel = new AppCache($kernel); // When using the HttpCache,you need to call the method in your front controller instead of relying on the configuration parameter //Request::enableHttpMethodParameterOverride(); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request,$response);
现在在你的AppKernel中,使用这个新的超全局
// app/AppKernel.PHP use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Config\Loader\LoaderInterface; class AppKernel extends Kernel { public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load($this->getProjectDir().'/app/config/' . APP_CONfig_FILENAME . '.yml'); } }
然后在你的example1.yml中
# app/config/mysubdomain.yml imports: - { resource: 'parameters_example1.yml' } - { resource: 'routing_example1.yml' }