2011-07-22 15 views
7

私はMagentoで働いていて、CSSとJavascriptを1つの大きなファイルにマージする機能があります。Linux上のディレクトリを効率的に監視する方法は?

かかわらず、その長所と短所は、次のような問題がある:

最終的なファイルが含まれますが、複数のレベルでキャッシュされますがこれらに限定されない:

  • アマゾンCloudFrontの
  • プロキシサーバ
  • クライアントブラウザのキャッシュ

Magentoのは、MD5を使用しています結合されたcssファイルの合計を計算し、結合されたcssファイルの新しいファイル名を生成します。 Cssファイルの異なるセットを持つすべてのページが適切なマージされたCSSファイルを取得するようにします。

キャッシングの問題を回避するために、ファイルの変更タイムスタンプをそのハッシュに含めて、CSSファイルが変更されるたびに新しいハッシュが生成されるようにしました。

したがって、リソースのリンクが変更されたため、何らかの変更が加えられた場合でも、キャッシュのスコアは変更されません。

これまでのところは良い:

唯一の問題は、インクルードを生成するために使用されているファイル名は、通常、直接HTML-ヘッドブロックで参照されるだろう唯一のものであり、そしてドン」していること、ですtには、これらのファイルの中にcssインポートが含まれています。

したがって、cssファイル内にインポートされたファイルの変更によって新しいハッシュが作成されることはありません。

いいえ私は本当に再帰的にすべてのインポートを解析し、そのようなものをスキャンしたくありません。

私はむしろディレクトリベースのソリューションを考えました。ファイルシステムごとに「ディレクトリ内の最後の変更」を効率的に監視する方法はありますか?

私たちはext4を使用しています。

または、別の方法があります。findコマンドを使用すると、inodeインデックスに基づいてすべてのジョブが実行されるのでしょうか?

これは何ですか?

私は、ファイルシステム全体をスキャンすることなく、すぐに "変更"を見るプログラムをたくさん見てきました。私は、Linux上で利用可能な「ファイル操作監視」デーモンもあると信じています。

問題は、cssディレクトリがかなり大きいことです。

誰でも正しい方向に向けることができますか?

答えて

6

私はあなたが依存PHPファイルのいずれかが変更されたとき、あなたのメインのCSSファイルの変更日を変更するには、PHP-独立したデーモンを使用することをお勧め。あなたはそれのためにdnotify使用することができ、何かのように:

dnotify -a -r -b -s /path/to/imported/css/files/ -e touch /path/to/main/css/file; 
それがメインのCSSファイルに他のフォルダ内のファイルのいずれかが変更されるたびに、「タッチ」を実行します

(-a -r -b -s =任意のアクセス/再帰的ディレクトリ参照/バックグラウンドでの実行/出力なし)。あるいは、他のアクションを実行してPHPからテストすることもできます。

+0

これまでのベストソリューション!私は本当にそれが好き。バックグラウンドで仕事を聞く必要がない、より独立したソリューションを望んでいましたが、本当に好きです。 –

+1

さて、PHPは普通はコンパイルされたプログラムではずっと遅く、各ページの読み込みをチェックする方がはるかに高価で、変更があるたびに1回acionをトリガーします(変更はまれです)。しかし、スピードを気にしなければ、phpのreaddir()関数を使ってフォルダをループし、各ファイルに対してphpのstat()関数を使ってmtime(最終更新時刻)を得ることができます。変更を適用する前に少し遅延があってもパフォーマンスを大幅に向上させることができます。このチェックはN分ごとに実行できます(データベース/一時ファイル/ etc ...を使用して最後のチェック時間を保存できます)。 – XzKto

2

コマンドに

ls -ltr `find . -type f ` 

を使用する場合それはあなたの一番下にある最新の持つすべてのファイルの長いリストを提供します。

+0

かなり良いアイデア。 tailで最後の行を読み込み、md5sumに直接パイプすることもできます...しかし、findですべてのファイルを読み込み、lsに渡します。これはかなり早く/ bin/ls。もちろん、あなたは限界を上げることができますが、そのような巨大なデータの周りのパイピングはおそらく問題です... lsの再帰的なスイッチもあります。ソートはディレクトリごとでしかなく、全体ではないという問題があります。/ –

2

ディレクトリに変更が発生したときに通知を受けることができるパッケージをinotifyしようとしてください。

+0

私はそれを認識しています私はバックグラウンドで絶え間なく走る必要はないが、すべてのページが効率的に処理できることを望んでいた。 –

+0

@Joe Hopfgartner:私はPythonでinotifyを使用し、カーネルの通知を聞いている1つのスレッドでCを使用していますが、これは非常に効率的ですが)私はWebサーバーをやっていません... –

1

私はそれを使用していないが、どうやらthere is inotify support for PHP決してきました。

(inotifyのは、Linuxでの通知を取得するための最も効率的な方法だろう)

+0

私はinotifyサポートを認識しています常にバックグラウンドで実行する必要はないが、すべてのページが効率的に処理できる何かを望んでいる。 –

関連する問題