BugTrack/2264
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* attach プラグインの md5 計算、mimetypeのチェックによる...
- ページ: [[BugTrack2]]
- 投稿者: [[ryu1k]]
- 優先順位: 普通
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2007-07-29 (日) 22:16:25
- バージョン: 1.4.7
- リリース予定バージョン: 1.5.1
** 修正 [#o6a5b6fd]
- [[cvs:plugin/attach.inc.php]] (r1.87)
-- 「添付ファイルの一覧」を表示させる場面において、必ず「...
--- ページの下部に表示される、そのページに添付されたファ...
--- 添付ファイルの一覧 (そのページ/全ページ)
** メッセージ [#o34c8574]
attach プラグインはファイル情報を取得すると自動的に md5 ...
&color(red){問題点の補足 2007/7/30 追記};~
md5 を計算する際に OS のディスクキャッシュが追い出され、...
* 目次 [#rb086451]
#contents
* 仕様についての評価 [#if852abc]
簡潔に言えば ''md5 sum の表示は必要か?'' ということにな...
評価の前提
- 現在は常に自動で計算され、詳細ページで表示されています
- 詳細ページが表示された場合のみ md5 を計算することが可能...
- 計算負荷などに対する定量的な評価は今のところ行われてい...
- md5 計算に伴うディスクキャッシュの追出しは、環境によっ...
コメント
- たいしたコストでなく現行の仕様を保持できるならば現状維...
- お疲れ様です。ユーザーのニーズが不明確というのであれば...
-- 穏当な仕様変更であればためらわずおこなう。それによって...
-- ニーズと現状をなるべく正確に認識するように努め、うまい...
- 問題を切り分けるための条件についてコメントします。閲覧...
- もう一つ。MD5ハッシュを知りたいと思う主体が誰であるのか...
-- ※条件の整っている一般ユーザーならば、MD5ハッシュを知り...
-- ※条件の整っている管理者ならば、MD5値を別の場所であらか...
-- ※PukiWikiに一般的に添付されるファイルは、通常数MB(極端...
-- といった事から、「Webサーバー上でMD5計算をしたい管理者...
- もう一つ。「添付ファイルに対するMD5計算」を一般ユーザー...
- 自分が思いつくmd5の利用用途はトラブル時の調査です。(必...
-- ローカルでは見れるのにアップロードした画像が見れないと...
-- この場合はキャッシュされたmd5だと都合が悪いので、キャ...
--- 更新より、チェックの方がいいかな。md5ハッシュは変化し...
-- ふむふむ。Webサーバー上でmd5を叩け(て、かつencodeされ...
-- また、自動広告挿入機能などが添付ファイルを動的に破壊し...
#comment
* 修正案 [#cf09b73c]
- md5 の自動計算を無効化する
- md5 の計算結果をキャッシュする
- 上記 2 者に加えて現行の方式を加えた 3 方式を選択できる...
** 修正案の評価 [#ga7b40ed]
*** 現行 ( md5 を常に計算 ) [#t61874c3]
利点
- 仕様変更 0 です
欠点
- 添付ファイルの数やサイズによって、CPU 負荷の問題が発生...
//コメント
//#comment
*** md5 を計算しない [#gd102569]
利点
- そもそも負荷が発生しません
欠点
- 現行の attach plugin とは仕様が異なってしまいます
コメント
- (ここにあった話題は、修正案の分類の話題とは関係ないので...
//#comment
*** md5 をキャッシュする (添付してある実装の場合) [#f3bf4...
利点
- 仕様を維持しつつある程度の負荷軽減が実現できます
- ファイル実体をメモリに読み込むことがなくなるので、他の...
欠点
- 実装が複雑です。
- 負荷が完全になくなるわけではありません
- PukiWiki の正式なインターフェイス以外でタイムスタンプ保...
//コメント
//#comment
*** 上記 2 者または 3 者を選択できるようにする [#f3bf4f8f]
利点
- 互換性をとるも、負荷の軽減をとるもユーザーの自由になり...
欠点
- 複数実装をメンテナンスするコストが発生します
コメント
- 三択でよければ、私の方で(CVS版に対する)パッチを作成して...
//#comment
* 修正案の実現 [#td274506]
** md5 の計算結果をキャッシュする [#g111c712]
パッチ(( php は年に数回しかいじりません。添削歓迎します。...
ファイル名が非常に長いなどでハッシュファイルを作成できな...
Index: attach.inc.php
========================================================...
--- attach.inc.php (revision 39)
+++ attach.inc.php (revision 41)
@@ -47,6 +47,9 @@
// mime-typeを記述したページ
define('PLUGIN_ATTACH_CONFIG_PAGE_MIME', 'plugin/attach...
+// use md5 cache mechanizm
+define('PLUGIN_ATTACH_HASH_CACHE', TRUE); // FALSE or T...
+
//-------- convert
function plugin_attach_convert()
{
@@ -449,9 +452,67 @@
$this->logname = $this->basename . '.log';
$this->exist = file_exists($this->file...
$this->time = $this->exist ? filemtim...
- $this->md5hash = $this->exist ? md5_file...
+
+ $this->hashCacheFile =
+ CACHE_DIR . encode($page) . '_' . encode($t...
+ ($age ? '.' . $age : '') . '.attach_hash';
+
+ if ( PLUGIN_ATTACH_HASH_CACHE ) {
+ $this->md5hash = $this->getHashCache();
+ } else {
+ $this->md5hash = $this->exist ? md5_file($...
+ }
}
+ function getHashCache()
+ {
+ // cache file will be stored in cache/*.attac...
+ // Format: 3 int and 1 string splited by \t
+ // cache version : int (0)
+ // size : int (byte)
+ // stamp : int (mtime)
+ // md5sum : stringn (hex text)
+
+ if ( ! $this->exist ) { return ''; }
+
+ $cache_version = 0;
+
+ // open target file.
+ $fpf = fopen( $this->filename, "r" );
+ if( ! $fpf ) { return ''; } // It's strange...
+ $fresh = fstat( $fpf ); // get stat info
+
+ // open hash cache file
+ $fpc = fopen( $this->hashCacheFile, "r" );
+ if( $fpc ) { // cache existing.
+ $cached = fscanf($fpc, "%d\t%d\t%d\t%s\n");
+ if ( $cached[0] == $cache_version &&
+ $cached[1] == $fresh['size'] &&
+ $cached[2] == $fresh['mtime'] ) { // ...
+ fclose( $fpc );
+ fclose( $fpf );
+ return $cached[3];
+ // return "cache:" . $cached[3];
+ }
+ fclose( $fpc ); // close cache file once.
+ }
+
+ $md5 = md5_file($this->filename);
+
+ // Need to create cache
+ $fpc = fopen( $this->hashCacheFile, "w" );
+ if ( ! $fpc ) { fclose( $fpf ); return $md5; }
+
+ // generate cache file
+ fwrite($fpc,
+ sprintf("%d\t%d\t%d\t%s\n",
+ $cache_version, $fresh['size'], ...
+ fclose( $fpc );
+ fclose( $fpf );
+ return $md5;
+ // return "gen:" . $md5;
+ }
+
// ファイル情報取得
function getstatus()
{
@@ -617,7 +678,10 @@
}
}
- // バックアップ
+ // remove hash cache.
+ if ( PLUGIN_ATTACH_HASH_CACHE ) { @unlink($this...
+
+ // バックアップ
if ($this->age ||
(PLUGIN_ATTACH_DELETE_ADMIN_ONLY ...
@unlink($this->filename);
- あ。そういえば <添付ファイル名.log> って以前からあるな...
#comment
--------
* コメント [#y857788f]
- ここで聞く話なのかいまいちわかりませんので、適切な場所...
-- たいした規模でもないのでとりあえず[[作って:http://debi...
-- こんにちは。この件、md5を計算させる意味がほとんど無い(...
-- 拡張子が付けられないという件はattachが生成するファイル...
-- よろしかったらBugTrackに持っていって、どのようなデザイ...
-- attach プラグインのデザイン全般に関する議論は今のとこ...
- ( ここまで、[[pukiwiki:雑談/16]] からコピーしました。 )...
- ファイル名の限界に関する問題についての確認ですが、ファ...
-- 拡張子を追加する事によりファイルが作成できないことがあ...
- お疲れ様です。こちらの件、そもそものニーズの部分から掘...
- (MD5を計算する処理は) attach_info以外では使われていない...
--修正案。詳細表示以外では十分効果があるかと。詳細表示の...
---function attach_info($err = '')
$obj = & new AttachFile($refer, $file, $age);
+$obj->md5hash = $obj->exist ? md5_file($obj->filename)...
---class AttachFileのfunction AttachFile($page, $file, $a...
-$this->md5hash = $this->exist ? md5_file($this->filena...
- あ。確かに今現在の外部仕様変わりませんね。賛成です。キ...
- ハッシュのキャッシュを無理にでも生き残らせようとしてい...
- ぃぉぃぉさんの指摘されている件、コンストラクタで必ず md...
-- [[cvs:plugin/attach.inc.php]] (r1.87) この部分は明らか...
-- ・・・えーと、PukiWikiはデフォルトで添付ファイルの一覧...
-- とりあえず簡単にr1.87の結果報告をしておきます。r1.87 ...
-- 確認ありがとうございます。今回掘り出された問題の一つ(...
- もう一つ、重たい処理を発見しました。 -- [[ぃぉぃぉ]] &n...
$this->type = attach_mime_content_type($this->filena...
これも、このgethash()の様にgettype()としてやるのが良いで...
- それもですけど、attach_info() とAttachFile::info() から...
$obj = & new AttachFile($refer, $file, $age);
- return $obj->getstatus() ?
+ return $this->exist ?
$obj->info($err) :
array('msg'=>$_attach_messages['err_notfound']);
とするのが無難でしょうか? -- &new{2008-05-24 (土) 11:39...
- MD5速度改善のご対応を誠にありがとうございました。~
~ぃぉぃぉさんのご指摘通り、attach_mime_content_type()内で...
数秒程度の負荷がかかるようです。
$size = @getimagesize($filename);
~この関数は、どんなファイルであっても画像ファイルを前提に...
画像拡張子を持たないファイルで、中身だけ画像であるファイ...
~逆にjpgを装った、不正なファイルはあるかもしれないので、
画像拡張子を持ったファイルのみ中身をチェックするようにす...
~
~ 実際には下記のコードを使用してみました。
~
... ここまで同じです。
if (! file_exists($filename)) return $type;
$matches = array();
if (! preg_match('/_((?:[0-9A-F]{2})+)(?:\.\d+)?$...
return $type;
$filename_decode = decode($matches[1]);
$psinfo0 = pathinfo(decode($filename_decode));
$ext0 = $psinfo0['extension'];
if( preg_match( '/gif|png|jpg|jpeg/i', $ext0 ) ) {
$size = @getimagesize($filename);
if (is_array($size)) {
switch ($size[2]) {
case 1: return 'image/gif';
case 2: return 'image/jpe...
case 3: return 'image/png';
case 4: return 'applicati...
}
}
}
// mime-type一覧表を取得
~
- if (preg_match("/\.$ext$/i", $filename)) return...
+ if (preg_match("/\.$ext$/i", $filename_decode))...
~適用した結果、巨大ファイル(pdfなど)を添付した時でも、2...
~コード自体に改善点はあるかもしれませんが、参考になれば幸...
- md5について [[commit:2b92bec1fe17dc0c690cc66df6f7d5ed64...
- mime-typeの問題を見落としていました。画像拡張子を持たな...
#comment
終了行:
* attach プラグインの md5 計算、mimetypeのチェックによる...
- ページ: [[BugTrack2]]
- 投稿者: [[ryu1k]]
- 優先順位: 普通
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2007-07-29 (日) 22:16:25
- バージョン: 1.4.7
- リリース予定バージョン: 1.5.1
** 修正 [#o6a5b6fd]
- [[cvs:plugin/attach.inc.php]] (r1.87)
-- 「添付ファイルの一覧」を表示させる場面において、必ず「...
--- ページの下部に表示される、そのページに添付されたファ...
--- 添付ファイルの一覧 (そのページ/全ページ)
** メッセージ [#o34c8574]
attach プラグインはファイル情報を取得すると自動的に md5 ...
&color(red){問題点の補足 2007/7/30 追記};~
md5 を計算する際に OS のディスクキャッシュが追い出され、...
* 目次 [#rb086451]
#contents
* 仕様についての評価 [#if852abc]
簡潔に言えば ''md5 sum の表示は必要か?'' ということにな...
評価の前提
- 現在は常に自動で計算され、詳細ページで表示されています
- 詳細ページが表示された場合のみ md5 を計算することが可能...
- 計算負荷などに対する定量的な評価は今のところ行われてい...
- md5 計算に伴うディスクキャッシュの追出しは、環境によっ...
コメント
- たいしたコストでなく現行の仕様を保持できるならば現状維...
- お疲れ様です。ユーザーのニーズが不明確というのであれば...
-- 穏当な仕様変更であればためらわずおこなう。それによって...
-- ニーズと現状をなるべく正確に認識するように努め、うまい...
- 問題を切り分けるための条件についてコメントします。閲覧...
- もう一つ。MD5ハッシュを知りたいと思う主体が誰であるのか...
-- ※条件の整っている一般ユーザーならば、MD5ハッシュを知り...
-- ※条件の整っている管理者ならば、MD5値を別の場所であらか...
-- ※PukiWikiに一般的に添付されるファイルは、通常数MB(極端...
-- といった事から、「Webサーバー上でMD5計算をしたい管理者...
- もう一つ。「添付ファイルに対するMD5計算」を一般ユーザー...
- 自分が思いつくmd5の利用用途はトラブル時の調査です。(必...
-- ローカルでは見れるのにアップロードした画像が見れないと...
-- この場合はキャッシュされたmd5だと都合が悪いので、キャ...
--- 更新より、チェックの方がいいかな。md5ハッシュは変化し...
-- ふむふむ。Webサーバー上でmd5を叩け(て、かつencodeされ...
-- また、自動広告挿入機能などが添付ファイルを動的に破壊し...
#comment
* 修正案 [#cf09b73c]
- md5 の自動計算を無効化する
- md5 の計算結果をキャッシュする
- 上記 2 者に加えて現行の方式を加えた 3 方式を選択できる...
** 修正案の評価 [#ga7b40ed]
*** 現行 ( md5 を常に計算 ) [#t61874c3]
利点
- 仕様変更 0 です
欠点
- 添付ファイルの数やサイズによって、CPU 負荷の問題が発生...
//コメント
//#comment
*** md5 を計算しない [#gd102569]
利点
- そもそも負荷が発生しません
欠点
- 現行の attach plugin とは仕様が異なってしまいます
コメント
- (ここにあった話題は、修正案の分類の話題とは関係ないので...
//#comment
*** md5 をキャッシュする (添付してある実装の場合) [#f3bf4...
利点
- 仕様を維持しつつある程度の負荷軽減が実現できます
- ファイル実体をメモリに読み込むことがなくなるので、他の...
欠点
- 実装が複雑です。
- 負荷が完全になくなるわけではありません
- PukiWiki の正式なインターフェイス以外でタイムスタンプ保...
//コメント
//#comment
*** 上記 2 者または 3 者を選択できるようにする [#f3bf4f8f]
利点
- 互換性をとるも、負荷の軽減をとるもユーザーの自由になり...
欠点
- 複数実装をメンテナンスするコストが発生します
コメント
- 三択でよければ、私の方で(CVS版に対する)パッチを作成して...
//#comment
* 修正案の実現 [#td274506]
** md5 の計算結果をキャッシュする [#g111c712]
パッチ(( php は年に数回しかいじりません。添削歓迎します。...
ファイル名が非常に長いなどでハッシュファイルを作成できな...
Index: attach.inc.php
========================================================...
--- attach.inc.php (revision 39)
+++ attach.inc.php (revision 41)
@@ -47,6 +47,9 @@
// mime-typeを記述したページ
define('PLUGIN_ATTACH_CONFIG_PAGE_MIME', 'plugin/attach...
+// use md5 cache mechanizm
+define('PLUGIN_ATTACH_HASH_CACHE', TRUE); // FALSE or T...
+
//-------- convert
function plugin_attach_convert()
{
@@ -449,9 +452,67 @@
$this->logname = $this->basename . '.log';
$this->exist = file_exists($this->file...
$this->time = $this->exist ? filemtim...
- $this->md5hash = $this->exist ? md5_file...
+
+ $this->hashCacheFile =
+ CACHE_DIR . encode($page) . '_' . encode($t...
+ ($age ? '.' . $age : '') . '.attach_hash';
+
+ if ( PLUGIN_ATTACH_HASH_CACHE ) {
+ $this->md5hash = $this->getHashCache();
+ } else {
+ $this->md5hash = $this->exist ? md5_file($...
+ }
}
+ function getHashCache()
+ {
+ // cache file will be stored in cache/*.attac...
+ // Format: 3 int and 1 string splited by \t
+ // cache version : int (0)
+ // size : int (byte)
+ // stamp : int (mtime)
+ // md5sum : stringn (hex text)
+
+ if ( ! $this->exist ) { return ''; }
+
+ $cache_version = 0;
+
+ // open target file.
+ $fpf = fopen( $this->filename, "r" );
+ if( ! $fpf ) { return ''; } // It's strange...
+ $fresh = fstat( $fpf ); // get stat info
+
+ // open hash cache file
+ $fpc = fopen( $this->hashCacheFile, "r" );
+ if( $fpc ) { // cache existing.
+ $cached = fscanf($fpc, "%d\t%d\t%d\t%s\n");
+ if ( $cached[0] == $cache_version &&
+ $cached[1] == $fresh['size'] &&
+ $cached[2] == $fresh['mtime'] ) { // ...
+ fclose( $fpc );
+ fclose( $fpf );
+ return $cached[3];
+ // return "cache:" . $cached[3];
+ }
+ fclose( $fpc ); // close cache file once.
+ }
+
+ $md5 = md5_file($this->filename);
+
+ // Need to create cache
+ $fpc = fopen( $this->hashCacheFile, "w" );
+ if ( ! $fpc ) { fclose( $fpf ); return $md5; }
+
+ // generate cache file
+ fwrite($fpc,
+ sprintf("%d\t%d\t%d\t%s\n",
+ $cache_version, $fresh['size'], ...
+ fclose( $fpc );
+ fclose( $fpf );
+ return $md5;
+ // return "gen:" . $md5;
+ }
+
// ファイル情報取得
function getstatus()
{
@@ -617,7 +678,10 @@
}
}
- // バックアップ
+ // remove hash cache.
+ if ( PLUGIN_ATTACH_HASH_CACHE ) { @unlink($this...
+
+ // バックアップ
if ($this->age ||
(PLUGIN_ATTACH_DELETE_ADMIN_ONLY ...
@unlink($this->filename);
- あ。そういえば <添付ファイル名.log> って以前からあるな...
#comment
--------
* コメント [#y857788f]
- ここで聞く話なのかいまいちわかりませんので、適切な場所...
-- たいした規模でもないのでとりあえず[[作って:http://debi...
-- こんにちは。この件、md5を計算させる意味がほとんど無い(...
-- 拡張子が付けられないという件はattachが生成するファイル...
-- よろしかったらBugTrackに持っていって、どのようなデザイ...
-- attach プラグインのデザイン全般に関する議論は今のとこ...
- ( ここまで、[[pukiwiki:雑談/16]] からコピーしました。 )...
- ファイル名の限界に関する問題についての確認ですが、ファ...
-- 拡張子を追加する事によりファイルが作成できないことがあ...
- お疲れ様です。こちらの件、そもそものニーズの部分から掘...
- (MD5を計算する処理は) attach_info以外では使われていない...
--修正案。詳細表示以外では十分効果があるかと。詳細表示の...
---function attach_info($err = '')
$obj = & new AttachFile($refer, $file, $age);
+$obj->md5hash = $obj->exist ? md5_file($obj->filename)...
---class AttachFileのfunction AttachFile($page, $file, $a...
-$this->md5hash = $this->exist ? md5_file($this->filena...
- あ。確かに今現在の外部仕様変わりませんね。賛成です。キ...
- ハッシュのキャッシュを無理にでも生き残らせようとしてい...
- ぃぉぃぉさんの指摘されている件、コンストラクタで必ず md...
-- [[cvs:plugin/attach.inc.php]] (r1.87) この部分は明らか...
-- ・・・えーと、PukiWikiはデフォルトで添付ファイルの一覧...
-- とりあえず簡単にr1.87の結果報告をしておきます。r1.87 ...
-- 確認ありがとうございます。今回掘り出された問題の一つ(...
- もう一つ、重たい処理を発見しました。 -- [[ぃぉぃぉ]] &n...
$this->type = attach_mime_content_type($this->filena...
これも、このgethash()の様にgettype()としてやるのが良いで...
- それもですけど、attach_info() とAttachFile::info() から...
$obj = & new AttachFile($refer, $file, $age);
- return $obj->getstatus() ?
+ return $this->exist ?
$obj->info($err) :
array('msg'=>$_attach_messages['err_notfound']);
とするのが無難でしょうか? -- &new{2008-05-24 (土) 11:39...
- MD5速度改善のご対応を誠にありがとうございました。~
~ぃぉぃぉさんのご指摘通り、attach_mime_content_type()内で...
数秒程度の負荷がかかるようです。
$size = @getimagesize($filename);
~この関数は、どんなファイルであっても画像ファイルを前提に...
画像拡張子を持たないファイルで、中身だけ画像であるファイ...
~逆にjpgを装った、不正なファイルはあるかもしれないので、
画像拡張子を持ったファイルのみ中身をチェックするようにす...
~
~ 実際には下記のコードを使用してみました。
~
... ここまで同じです。
if (! file_exists($filename)) return $type;
$matches = array();
if (! preg_match('/_((?:[0-9A-F]{2})+)(?:\.\d+)?$...
return $type;
$filename_decode = decode($matches[1]);
$psinfo0 = pathinfo(decode($filename_decode));
$ext0 = $psinfo0['extension'];
if( preg_match( '/gif|png|jpg|jpeg/i', $ext0 ) ) {
$size = @getimagesize($filename);
if (is_array($size)) {
switch ($size[2]) {
case 1: return 'image/gif';
case 2: return 'image/jpe...
case 3: return 'image/png';
case 4: return 'applicati...
}
}
}
// mime-type一覧表を取得
~
- if (preg_match("/\.$ext$/i", $filename)) return...
+ if (preg_match("/\.$ext$/i", $filename_decode))...
~適用した結果、巨大ファイル(pdfなど)を添付した時でも、2...
~コード自体に改善点はあるかもしれませんが、参考になれば幸...
- md5について [[commit:2b92bec1fe17dc0c690cc66df6f7d5ed64...
- mime-typeの問題を見落としていました。画像拡張子を持たな...
#comment
ページ名: