2017-06-20 47 views
3

因此,我正在安靜地構建一個基於Symfony 3的大型SAAS Web應用程序。大約有10-20個應用程序,現在已經發展到超過500多個應用程序。單獨的供應商目錄已經是每個應用程序150 + MB的大小。帶共享代碼庫的多實例symfony應用程序

所有這些應用程序都有自己的數據庫。我想保持這種方式。不過,我相信如果一些代碼被共享,這將是很好的。以供應商和src目錄爲例。這在每個應用程序中都是相同的,但是它們都是在OpCache中單獨「加載」的。我相信從資源的角度來看,如果這些目錄是共享的,那將是最好的。

Composer和Symfony似乎都不支持共享目錄的多實例應用程序。然而,我想知道如果有人有任何線索來實現我的想法或者我的計劃不可行?

配置對於每個應用程序(parameters.yml)是不同的,並且web目錄在每個應用程序中包含不同的樣式表。所以他們需要與其他人分開。

我一直在考慮爲此使用環境設置,但我們有環境「測試」,「開發」,「應用程序1」,「應用程序2」等,感覺不對。config_prod.yml突然也變得無法使用。

我的思維方式錯了嗎?有關如何實現這一目標的任何建議?或者我應該去一個完整的單獨實例?

(我們的應用程序使用的是SemVer,如果我們有版本1.0.0,版本1.1.0的共享代碼,那麼它甚至會很好,所以這甚至是最上面的一個層次,但也許這是下一步)

編輯: 澄清更多; 實質上你可以說web目錄和var目錄都不可共享。 Web目錄包含自定義樣式表,並且是主要的入口點。 var目錄包含緩存文件,根據其數據庫設置,每個應用程序的緩存文件都不相同。 最後,您還有自定義參數文件,每個應用程序都有不同的數據庫憑據。

我嘗試過符號鏈接,但作曲家對此並不滿意。另外,使用符號鏈接時,工作目錄始終是實際使用的目錄,而不是實際的符號鏈接目錄。 我也嘗試使用應用程序的vhost文件中的自定義設置。覆蓋高速緩存和內核目錄是可能的,但是你又失去了你所符合的實際目錄。

+0

只是一個想法:Opcache使用真正的路徑,你可以替換文件,如果相同的符號鏈接到「父母」。在作曲家安裝後腳本化,你可以從中解脫... – hakre

+0

是的,我試過了。但是,作曲家不支持供應商目錄由多個應用程序符號鏈接。它可以在某個自動加載器中的某處保存路徑。 –

+0

我不是指供應商文件夾,而是包中的代碼。而不是軟件包,但在該級別下的所有文件都是相同的。 Linke遞歸地比較兩個目錄樹,如果文件相同,則用符號鏈接替換它。 opcache然後將使用實際路徑。這必須在腳本中完成,以便可以通過根除供應商文件夾進行重置,使用composer重新安裝,然後重新運行compare&link腳本。 – hakre

回答

0

您需要創建自定義配置目錄和/或文件,然後根據您使用的任何標準調整您的AppKernel以指向正確的配置目錄和/或文件。例如,如果您要離開某個子域: 首先,請更新您的前端控制器以創建一個新的超級全局域。有可能是一個更好的方式來做到這一點,我建議你尋找到的..

// 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' } 
+0

感謝您的回覆,但我不認爲這完全可以解決問題。如前所述,每個應用程序都有一個單獨的數據庫。這意味着緩存也不能在應用程序之間共享。我會更新我的主帖。 –

+0

所以你只需在config_ {x} .yml'中更改緩存配置設置,並在'parameters_ {x} .yml'中設置數據庫參數 - 並且爲了緩存,您必須設置非文件系統存儲或者像redis之類的自定義緩存處理程序,或者如果您想要的話;數據庫驅動的緩存與pdo像這樣:https://symfony.com/doc/master/components/cache/adapters/pdo_doctrine_dbal_adapter.html或單獨的pdo會話處理程序:http://symfony.com/doc/current/doctrine/ pdo_session_storage.html –

+0

除了這個事實,如果你是對的或者沒有(我相信你讓它聽起來更容易,那實際上是因爲我不能在緩存中存儲任何yml文件),它仍然不能解決問題將vendor和src目錄(可能更多)放在共享目錄中。 –

相關問題