Auto Document Image Resizerのキャッシュ処理について

質問全般・改善要望
アバター
kmikage
管理人
記事: 396
登録日時: 2009年9月01日(火) 20:21

Auto Document Image Resizerのキャッシュ処理について

投稿記事by kmikage » 2010年5月25日(火) 13:27

kmikageです。こちらでははじめましてです。なますて。

Auto Document Image Resizer(Resampler)というプラグインがあり、
TinyMCE上で縮小した画像を、imgタグを読んで自動的にリサイズしてくれるプラグインです。
http://www.danielgibbs.net/journal/auto ... mages-modx

しかし、このプラグインには致命的な問題があり、
・/assets/cache以下に画像ファイルをベタに置いていくので、同一ファイルを複数箇所で呼び出している時に不具合が出る。
・ページが更新される=MODx側キャッシュがクリアされるタイミングでcache以下の画像が消えない為、手動で消す必要がある。

前者は新規に画像を管理するコードを書く事で回避出来そうなのですが、
後者のキャッシュがクリア、もしくは生成されるタイミングのイベントがわからず、つまずいています。

どなたかヒントがあれば教えていただけませんでしょうか。

環境は以下の通りです。
MODx 1.0.3J-p1

美ら海サーバ 共用ホスティング
Linux 2.6 / Apache 2.2.3 / PHP 5.1.6 / safe_mode off / GD enabled(2.0.28)

よろしくお願いします。
同人サークル にくじゃがソフトウェア
http://www.nikujaga.info/

ブログはじめました。
http://kmikage.nikujaga.info/
アバター
yama
管理人
記事: 3154
登録日時: 2009年7月29日(水) 02:50

Re: Auto Document Image Resizerのキャッシュ処理について

投稿記事by yama » 2010年5月25日(火) 14:50

前者はファイルの縦横幅ごとに縮小ファイルを作ればよさそうですね。
後者は2つアプローチがあって、
・縮小ファイルのファイル名に「.pageCache」を含めて、ページキャッシュ扱いで削除
・OnCacheUpdateまたはOnBeforeCacheUpdateあたりのシステムイベントに引っ掛けて削除
かな?と思います
アバター
kmikage
管理人
記事: 396
登録日時: 2009年9月01日(火) 20:21

Re: Auto Document Image Resizerのキャッシュ処理について

投稿記事by kmikage » 2010年5月30日(日) 19:19

レスが遅くなってしまってスミマセン・・・。TT(ちょっとドタバタしてました・・・OTL)

>yamaさん
アドバイスありがとうございます。
ページキャッシュの動きがいまいち見えないですが、テスト実装して動きを見てみたいと思います。

また何かあればポストします。。。
同人サークル にくじゃがソフトウェア
http://www.nikujaga.info/

ブログはじめました。
http://kmikage.nikujaga.info/
アバター
yama
管理人
記事: 3154
登録日時: 2009年7月29日(水) 02:50

Re: Auto Document Image Resizerのキャッシュ処理について

投稿記事by yama » 2010年5月30日(日) 19:57

MODxのシステムがキャッシュをクリアするタイミングにいっしょにパージすればいいのですよね?
それなら生成サムネイルファイルの名前を少し変えるだけでよいと思います。
たとえば「thumb_xxxxx.jpg」という名前のファイルを生成するようになってたら、「thumb_xxxxx.pageCache.jpg」とする感じで。

もしタイミングもコントロールしたくて独自実装したい場合はdocumentParserの$modx->clearCacheメソッドを参考にするとよさそうに思います。
(システムが標準で使うcache_sync.processorとは別系統の処理ですが、こっちのほうが単純で分かりやすい)
アバター
kmikage
管理人
記事: 396
登録日時: 2009年9月01日(火) 20:21

Re: Auto Document Image Resizerのキャッシュ処理について

投稿記事by kmikage » 2010年6月04日(金) 04:53

えーっと、実装してみました。cache以下にファイルを置くのは健在ですが、
・ファイル名にリソースID・乱数を含む。キャッシュ制御はMODxに任せる。
・imagetable_data.pageCache.phpをデータファイルとして作成し、元ファイルとの関連づけを管理する。こちらもキャッシュの一部としてMODx側で適宜削除される。
といった仕様にしています。

また仕様追加として、
・同一リソース内で同一ファイルを複数箇所使用した場合でも、画像をそれぞれ個別に管理する。
・リサイズ画像のキャッシュコントロール(MODx側キャッシュ処理に依存)。

まだテスト不足なのでどのような挙動をするかわかりませんが、以下の不具合を確認しています。
・リロード2回目で、リサイズ画像ではなく元画像が参照されるようになる。(原因は不明。。。OTL どなたか解析して頂けると嬉しいです。)
・PNG画像を処理した際の挙動が不審。

使い方ですが、Pluginに挿入後、イベント「OnWebPagePrerender」にチェックを入れます。
次に、TinyMCEの設定でPath Optionsを変更(docrelative)します。
以上でインストールは完了です。

TinyMCE上でリサイズ前の画像を挿入後、そのまま解像度を変更してリソースを保存すると、
自動的にリサイズ処理がされます。


マクドナルドの椅子が堅くて辛いので、そろそろお家に帰ります。。。
添付ファイル
AutoResizer.txt
(8.05 KiB) ダウンロード数: 184 回
同人サークル にくじゃがソフトウェア
http://www.nikujaga.info/

ブログはじめました。
http://kmikage.nikujaga.info/
アバター
kmikage
管理人
記事: 396
登録日時: 2009年9月01日(火) 20:21

Re: Auto Document Image Resizerのキャッシュ処理について

投稿記事by kmikage » 2010年6月04日(金) 07:49

アップデートしました。バグフィックスになります。

・リロード2回目で、リサイズ画像ではなく元画像が参照されるようになる。(原因は不明。。。OTL どなたか解析して頂けると嬉しいです。)
→ファイル名の扱いが複雑になった関係で発生していました。ファイル名を処理するfunctionを追加して対応しました。

・ PNG画像を処理した際の挙動が不審。
→pngの再圧縮の処理でおかしくなるようです。
 GD関数の引数が明らかに適当でしたので、容量の事も考えJPEGでリサイズするよう変更しました。
 尚、コード上ではGIFも対応するようですが、サンプルの画像を用意していないのでまだテストしていません。
 (こちらもコードは適当でした。動くかどうか怪しいです。)

・画像圧縮率の変更
→デフォルトでは圧縮率100(最高画質)でしたが、画像によってはQVGA程度でも100KBを超える事がありメリットは無いと考え、
 kmikageがPhotoshopで普段使っている80に変更しました。
 この値はコードの先頭部分で書き換えが可能です。

かなり突貫(一晩)で手を入れたので汚いコードですが・・・お許し下さい。^^;;;;;
添付ファイル
Resampler.zip
(2.8 KiB) ダウンロード数: 204 回
同人サークル にくじゃがソフトウェア
http://www.nikujaga.info/

ブログはじめました。
http://kmikage.nikujaga.info/