2017-06-20 15 views
3

symfony 3の上に大きなSAAS Webアプリケーションビルドを静かにしています。約10〜20個のアプリケーションから始まり、現在500以上のアプリケーションに成長しました。既にアプリケーションごとのベンダーディレクトリだけが150MB以上のサイズです。共有コードベースのマルチインスタンスsymfonyアプリケーション

これらのアプリケーションにはそれぞれ独自のデータベースがあります。私はこのようにしたいと思います。しかし、いくつかのコードが共有されているといいと思います。たとえばvendorディレクトリとsrcディレクトリを取ってください。すべてのアプリケーションで同じですが、すべてがOpCacheに個別にロードされます。私はリソースの意味で、これらのディレクトリが共有されるのが最善であると信じています。

ComposerとSymfonyの両方は、実際には共有ディレクトリを多く持つマルチインスタンスアプリケーションをサポートしていないようです。しかし、誰かが私が念頭に置いたことを達成するための手がかりを持っているのか、それとも私の計画が実現できないのか疑問に思っていましたか?

設定はアプリケーション(parameters.yml)ごとに異なり、ウェブディレクトリにはアプリケーションごとに異なるスタイルシートが含まれています。だから、彼らは残りの部分から分離する必要があります。

私はこのために環境設定を使用することを考えていましたが、環境 "test"、 "dev"、 "application1"、 "application2"などがあるとは思わないでしょう。config_prod.ymlが突然また使用できなくなります。

私の考え方は間違っていますか?どのようにこれを達成するための任意の提案?あるいは、私はちょうど完全な別々のインスタンスと一緒に行くべきですか?

(私たちのアプリケーションではSemVerを使用していますが、バージョン1.0.0。、バージョン1.1.0などのコードを共有していればうれしいでしょう。これも上の次のレイヤーです。 )

編集: もう少し明確にするために。 本質的に、webディレクトリとvarディレクトリはどちらも共有できないと言うことができます。 Webディレクトリにはカスタムスタイルシートが含まれており、主要なエントリポイントです。 varディレクトリには、データベース設定に応じてアプリケーションごとに異なるキャッシュファイルが含まれています。 最後に、データベース資格情報を格納するアプリケーションごとに異なるカスタムパラメータファイルもあります。

私はシンボリックリンクを試みましたが、作曲家はそれに本当に満足していません。また、シンボリックリンクを使用する場合、作業ディレクトリは実際に使用されているディレクトリであり、シンボリックリンクされている実際のディレクトリではありません。 私はまた、アプリケーションのvhostファイルでカスタム設定を試みました。キャッシュディレクトリとカーネルディレクトリをオーバーライドすることは可能ですが、シンボリックリンクを行っている実際のディレクトリもまた緩くなります。

+0

ちょうどアイデア:Opcacheは実パスを使用します。同じ場合は、「親」へのシンボリックリンクでファイルを置き換えることができます。作曲家のインストール後にスクリプトを作成し、おそらくそれから安心することができます... – hakre

+0

ええ、私はそれを試みました。しかし、作曲家は、ベンダーのディレクトリが複数のアプリケーションによってシンボリックリンクされていることをサポートしていません。オートローダのいずれかのどこかにパスを保存します。 –

+0

私はベンダーのフォルダを意味するのではなく、パッケージ内のコードを意味します。パッケージではなく、そのレベルのすべてのファイルは同じです。 Linkeは2つのディレクトリツリーを再帰的に比較し、ファイルが同じ場合はシンボリックリンクで置き換えます。 opcacheはrealpathを使用します。これはスクリプトで行う必要があります。これにより、ベンダーフォルダを消去し、コンポーザーで再インストールしてから、compare&linkスクリプトを再実行してリセットできます。 – hakre

答えて

0

カスタム設定ディレクトリやファイルを作成し、使用している基準に基づいて適切なものを指すようにAppKernelを調整する必要があります。たとえば、サブドメインを外している場合: まず、フロントエンドコントローラを更新して新しいスーパーグローバルを作成します。そこにこれを行うには良い方法はおそらく、私はそれに探してお勧めします。..あなた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); 

、あなたのexample1.ymlでこの新しいスーパーグローバル

// 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'); 
    } 
} 

そしてを使用します

# app/config/mysubdomain.yml 
imports: 
    - { resource: 'parameters_example1.yml' } 
    - { resource: 'routing_example1.yml' } 
+0

あなたの応答をありがとうが、私はこれが完全に問題を解決するとは思わない。気づいたように、アプリケーションごとに別々のデータベースがあります。つまり、アプリケーション間でキャッシュを共有することはできません。私は私のメインポストを更新します。 –

+0

'config_ {x} .yml'でキャッシュ設定を変更するだけで、データベースパラメータは' parameters_ {x} .yml'にあります。キャッシュするには、ファイルシステムストア、またはredisのようなもののためのカスタムキャッシュハンドラ、または必要ならば、 https://symfony.com/doc/master/components/cache/adapters/pdo_doctrine_dbal_adapter.htmlや別のpdoセッションハンドラのようなpdoを使ったデータベース駆動型キャッシュ:http://symfony.com/doc/current/doctrine/ pdo_session_storage.html –

+0

あなたが正しいかどうかという事実を別にすれば(私はあなたがそれを楽にすると信じています。実際には、キャッシュのために何かをymlファイルに保存できないためです)、それでも問題は解決しません。 vendorディレクトリとsrcディレクトリ(おそらくはもっと多くのディレクトリ)を共有ディレクトリに持っています。 –

関連する問題