4

最近、Symfony2 アプリケーションを 2.1 にアップグレードし、それを新しいサーバーに移行したので、デプロイを簡単にするためにCapifonyを構成することにしました。APCLoader を使用しないようになったという事実を除いて、すべてがうまくいったので、並べ替えるまで一時的にこれをコメントアウトする必要がありました。

からの関連コードは次のapp.phpとおりです。

$loader = require_once __DIR__.'/../app/bootstrap.php.cache';

// Use APC for autoloading to improve performance.
// Change 'sf2' to a unique prefix in order to prevent cache key conflicts
// with other applications also using APC.

$loader = new ApcClassLoader('my_prefix', $loader);
$loader->register(true);

問題は、'my_prefix'リリースごとに一意ではないため、以前のリリースに属するキャッシュされたファイルを検索しようとすることになります。これは、まだ存在する場合と存在しない場合があります。これは明らかに非常に大きな問題です!

これに対する最善の解決策は何ですか?capifony がプレフィックスを#{latest_release}変数などの一意のものに変更するデプロイ前に実行するタスクを何らかの方法で作成する必要がありますか? または、展開するたびに APC キャッシュの内容全体を何らかの方法でリセットする必要がありますか?

これらのいずれかを行うための最良の方法についてはあまり確信が持てません。そのため、いずれかをお勧めする場合は、それを実装できるように正しい方向に向けてください。または、私が考えていなかった代替ソリューションはありますか?

4

3 に答える 3

9

ディレクトリに新しいファイルを作成し、HTTP 経由で実行してから削除するコマンドを提供するApcBundleを使用できます。次に、展開スクリプトでコマンドをweb/使用できます。run "/path/to/app/console apc:clear"

于 2012-10-12T12:56:15.883 に答える
1

これに対するもう 1 つの簡単な解決策は、クラス マップに APC を使用する代わりに、リリース プロセスの一部としてクラスマップ ファイルをビルドすることです。原因を突き止めることはできませんでしたが (とにかく)、新しいリリースをデプロイした後に apc ユーザー キャッシュをクリアしても、古いリリースがキャッシュを汚染する可能性があることがわかりました。(私はアンラベラーによって提案されたような方法を使用してクリアするため、方法がわかりません。新しいリリースへのシンボリックリンクを更新した後にそうするので、古いファイルにはアクセスできなくなりますが、それでも発生します.編集:なぜこれが起こるのかを考え出したhttps://stackoverflow.com/a/22680064/160565を参照)

とにかく、ここの「Composerのクラスマップ機能を使用する」セクションで説明されているように、composerを使用してオートローダーファイルをダンプすることに切り替えました: http://symfony.com/doc/current/book/performance.html

基本的に、app.php から ApcClassLoader を削除してから、次の行をデプロイメントに追加する必要があります。

php composer.phar dump-autoload --optimize

classmap ファイルを使用する場合と APC を使用してクラスの場所を直接キャッシュする場合の効率がどうなるかはわかりませんが、パフォーマンスに顕著な影響はないようです。どちらも、ルックアップごとにファイルシステムを手動でスキャンするよりも明らかに大幅に向上します。

編集: また、新しいリリースをデプロイした後に APC キャッシュをクリアするアプローチを取る場合は、ここで説明されているように、php のリアルパス キャッシュもクリア (または無効化)してください。そうしないと、キャッシュがクリアされた後も php が古いリリースのファイルにアクセスし続けるため、間違ったパスが再設定されます。

実際、とにかくリリース時に php の realpath キャッシュをクリアする (または無効にする) ことをお勧めします。そうしないと、キャッシュが期限切れになるまでプロジェクト内の非 php ファイルが php ファイルと同期しなくなるからです。

于 2014-03-27T06:29:05.563 に答える
1

APC キャッシュをクリアしてみてください。

これを行う最も簡単な方法は、Apache を再起動することです。

これを行うには、PHP スクリプトを作成することもできます。

<?php
apc_clear_cache();

見る:

グレースフル Apache 再起動は APC をクリアしますか?

http://php.net/manual/en/function.apc-clear-cache.php

于 2012-10-12T11:39:56.507 に答える