2016-02-09 15 views
6

私は実稼働環境でテストしているSymfony2のウェブサイトを持っています。私は先に進んでキャッシュをクリアしましたが、それ以上の修正を加える予定ですが、小さな問題があります。プロダクションでSymfonyのキャッシュを扱う

キャッシュがクリアされている間に、 Webサイトがキャッシュを再構築します。キャッシュが構築されているが、完全には作成されていないため、削除がまだ進行中であるため、半分が削除されます。

後で何が起こるかは、キャッシュが構築されますが、その一部だけです。 symfonyは、キャッシュは完全に構築され、それをもう作ろうとすることなく実行されると考えていますが、半完成のキャッシュで動作します。削除プロセスは少し長すぎます(〜15秒)ので、誰もウェブサイトにアクセスしてキャッシュを試して作成する必要はありません。

キャッシュが完全に構築され、古いキャッシュが上書きされ、システムはこれらの新しいファイルを古いものとして扱い、一部を削除し、残りの一部は残します。完全にはわからないが、私はこれをどうやって確認するか分からない。例えば

私は教義から別のキャッシュの問題を取得したいそのバンドルを使用しないのであれば、私が取得したいのいずれかのエラーが

The directory "D:\xampp\htdocs\med-app\app\app\cache\dev/jms_diextra/metadata" does not exist. 

です。これは、ウェブサイトにアクセスするすべての人が、そのウェブサイトにアクセスすることなくキャッシュを削除するまで表示されます。ウェブサイトへのアクセスが完全にブロックされ、機能しなくなります。

また、ウォームアップについてはどうですか?それにはしばらく時間がかかります。キャッシュがウォームアップされている間に誰かがウェブサイトにアクセスするとどうなりますか?それも紛争を引き起こしませんか?

この問題をどのように処理しますか?私は、apacheサービスを終了し、キャッシュを消去し、そしてApacheを再起動する必要がありますか?どのようにこれをプロダクションのウェブサイトで扱いますか?

編集 私が発見した興味深いものがあります。このバグは、cache/prodフォルダを削除したときに発生します。フォルダ自体を削除せずにフォルダの内容を削除すると、バグが発生しないようです。なぜ私は不思議です。

+0

私は 'sudo rm -rf app/cache/*'を使ってキャッシュを削除することをお勧めします。時間がかかることが多いと思います。 –

+0

キャッシュを手動でクリアしているので、手動でリフレッシュする必要もあります。 @johnSmithのコメントを参照して、短い時間で自動的にリフレッシュさせるか、完全に無効にします。 – Anil

+0

Windowsではxamppを使っているので 'rm'は使用できません。 –

答えて

4

通常、更新を実行している場合や、運用中に他の理由でキャッシュをクリアしている場合は、Webサイトをメンテナンスモードにロックすることをお勧めします。場合によっては、Webホスティングサービスでこれを処理するオプションがある場合や、コマンドラインから簡単にメンテナンスを処理するためにnice bundleがある場合があります。

この方法では、キャッシュを安全に削除し、誰もページにアクセスせずにキャッシュを間違って再構築することができます。

+0

lexikのメンテナンスバンドルもあります。あなたもその1つをお勧めしますか?とにかく、このバンドルによって生成されたメンテナンスページへのアクセスは、キャッシュからの書き込みまたはキャッシュへの読み込みを試みますか?以来、それはまだ問題を解決しません。 –

+0

私はlexikのバンドルに関する経験はありません。 'CorleyMaintenanceBundle'にはハードとソフトの2つのモードがあります。ハードロックを探しています、それはapache/nginxレベルで動作します。ソフトロックは依然としてキャッシュにアクセスします。 –

3

通常、Symfonyキャッシュをクリアする必要がある場合は、新しいバージョンにアップデートしていることを意味します。キャッシュをクリアするだけでなく、アセットをダンプして他のタスクを実行する必要があります。この場合、私がこれまでにやってきたことは、各プロダクションリリースを独自のバージョンとして扱うことです。新しいバージョンをインストールすると、Webサーバーから接続されず、変更されます完了したら新しいバージョンを指すようにWebサーバーを設定します。追加の利点は、何かを混乱させてロールバックを実行しなければならない場合、ただちに直前のバージョンにリンクすることです。今あなたが持っていると言う

/var/www/mysite/web -> /var/www/versions/1.0/web 

:あなたは、最新のバージョンにそのルートにシンボリックリンクを作るだろう

DocumentRoot /var/www/mysite/web 

はたとえば、Apacheの設定は、常にDocumentRootを持っている特定の場所を指して言いますインストールするサイトのバージョン1.1。あなたは、単に/var/www/versions/1.1にそれをインストール - 次に、単にシンボリックリンクを変更するなど、キャッシュを更新し、あなたの資産をインストールし、そこにコードを配置:サイトが恐ろしくクラッシュした場合

/var/www/mysite/web -> /var/www/versions/1.1/web 

は今、あなたは、単にシンボリックリンクをバック指すことができます。ここでの利点は、サイトにダウンタイムがないことと、間違いを起こした場合にロールバックするのが簡単だということです。これを自動化するには、新しいバージョンをインストールするbashスクリプトを使用し、一連のコマンドを &&で接続してシンボリックリンクを更新してください。インストールの一歩が失敗すると、インストール全体が失敗し、バージョンlimboの間に詰まっていません。

上記のやり方をすべてやり直すより良い方法があるかもしれませんが、生産を変更している場合は、Symfonyのインストール/セットアップを実行したいと思っています。

+0

ええ、私はこれがCapifonyでもできるのだろうかと思います。しかし、サーバーはあまりにも肥大化しませんか?すべてのバージョンのすべての 'web'イメージとアップロードをコピーする必要があります。 –

+0

それは間違いなく問題になる可能性があります。私のサイトでは事実上イメージを使わない傾向があるので、フットプリント全体が本当に小さくて、数十種類の過去のバージョンや何か、最近の2つまたは3つしか保存していないことを意味します。私はCapifonyが良い選択肢になると確信しています。 ..デプロイメントは私のことではなく、開発に集中できるようにできるだけ早く実行するようにしています。 –

関連する問題