ウェブ上の画像ファイルをデータベースで管理したいと思っています。
ただ毎回データベースから取り出しているとパフォーマンスが悪そうな
ので、一度リクエストされたファイルは実ファイルとして残しておくこ
とはできないものかと考えています。
例えば、以下のリクエストがあったときに、
http:/www.example.jp/image/abc/foo.gif
image/abc/foo.gif のファイルがあった場合と無かった場合で、次の
ように処理を分けたいのです。
【ファイルがある場合】
そのまま image/abc/foo.gif を渡す。
【ファイルが無い場合】
image_output.cgiを起動して、データベースに格納している
foo.gifをストリームに吐き出す。
ついでに image/abc/foo.gifを実ファイルとして出力しておく。
こういったリクエストの振分けを Apacheの設定で(mod_rewriteあたり
を使って?)行うことは可能でしょうか?
--
Tanaka-Qtaro-Yasuhiro mailto:ta...@ca2.so-net.ne.jp
Tanaka-Qtaro-Yasuhiro wrote:
> 田中久太郎です。
>
> ウェブ上の画像ファイルをデータベースで管理したいと思っています。
>
> ただ毎回データベースから取り出しているとパフォーマンスが悪そうな
> ので、一度リクエストされたファイルは実ファイルとして残しておくこ
> とはできないものかと考えています。
(以下略)
In article <c14558$fv1$1...@news-wst.ocn.ad.jp>
Tanaka-Qtaro-Yasuhiro <ta...@ca2.so-net.ne.jp> writes:
> 【ファイルが無い場合】
> image_output.cgiを起動して、データベースに格納している
> foo.gifをストリームに吐き出す。
> ついでに image/abc/foo.gifを実ファイルとして出力しておく。
Redirect するとなんとかいけそーな気もします。
> ウェブ上の画像ファイルをデータベースで管理したいと思っています。
>
> ただ毎回データベースから取り出しているとパフォーマンスが悪そうな
> ので、一度リクエストされたファイルは実ファイルとして残しておくこ
> とはできないものかと考えています。
どこまで強い一貫性を求めるかにもよりますが、データベースに入
れてあっても、全部ファイルとしてアクセス可能にしておいて、定
期的に、ファイルが最新かどうかを調べるとか、その程度ではダメ
ですか。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
名称不定さんの<c14ufj$1tl$1...@news511.nifty.com>から
> DBの外に出すとなると、DB内のファイルと実ファイルの
> 内容が一致していることをどうやって保証してやるか
> (DB内のファイルが更新された時に実ファイルを
> どうやって更新させるか)という問題が起きるのでは
> ないでしょうか?
たしかにそこは注意が必要ですね。
DB内のファイル更新時には実ファイルを消す処理を入れる予定です。
> また、DBにはファイルへのパス名だけを記録して、
> 実ファイルをDBの外へ置くという方法もあると思います。
今は上記の方法をとっています。
ただ、なるべくデータの一貫性を保ちたいのと、バックアップ&リス
トアで楽をしたくて、データベース内にファイルを格納したいと思っ
ています。
> あとは、RAMをたくさん搭載してキャッシュに載せてしまうとか。
> 下手に実ファイルにも書き出すより、OSのキャッシュ管理機能に
> 任せてしまった方が速い場合もあると思います。
なるほど。OSのキャッシュ管理機能ですか。
Linux+Apacheの場合だとどういうふうにやるのがいいですかね。
--
Tanaka-Qtaro-Yasuhiro mailto:ta...@ca2.so-net.ne.jp
*-*-*-* NGMP改訂CFV実施中 see fj.news.policy *-*-*-*
Tanaka-Qtaro-Yasuhiro wrote:
> ただ、なるべくデータの一貫性を保ちたいのと、バックアップ&リス
> トアで楽をしたくて、データベース内にファイルを格納したいと思っ
> ています。
一貫性を保つという意味ではDBは有効ですが、
それほど頻繁に(分秒単位で)更新されるのでなければ、
ファイル形式のインデックスで足りるのではないでしょうか。
また、私にはDBよりも普通のファイルの方がバックアップが
簡単に思えます。 tar -zcf backup.tgz /var/www/html みたいに
するだけですし。(^^;;
>>あとは、RAMをたくさん搭載してキャッシュに載せてしまうとか。
>>下手に実ファイルにも書き出すより、OSのキャッシュ管理機能に
>>任せてしまった方が速い場合もあると思います。
>
> なるほど。OSのキャッシュ管理機能ですか。
> Linux+Apacheの場合だとどういうふうにやるのがいいですかね。
Linux なら、RAMの大部分はファイルデータのキャッシュに
割り当てられますので、何も考える必要はないと思います。(^^;
するとしたら、メモリ節約の意味でも、安全のためにも、使わない
プログラム(ftpd とか)を起動させない設定にしておく位でしょうか。
名称不定さんの<c16t8l$82a$1...@news511.nifty.com>から
> 一貫性を保つという意味ではDBは有効ですが、
> それほど頻繁に(分秒単位で)更新されるのでなければ、
> ファイル形式のインデックスで足りるのではないでしょうか。
> また、私にはDBよりも普通のファイルの方がバックアップが
> 簡単に思えます。 tar -zcf backup.tgz /var/www/html みたいに
> するだけですし。(^^;;
ファイルだけならばおっしゃる通りなのですが、ファイル以外の
データも少なからずデータベース内にあるんですよね。それを別
々に管理するのが面倒だなあ、と。
すいません言葉が足りなくて。
> Linux なら、RAMの大部分はファイルデータのキャッシュに
> 割り当てられますので、何も考える必要はないと思います。(^^;
あ、そういう意味でしたか。
データベース内のファイルをストリームで出力したときに、それ
の出力データをRAMにキャッシュできるような仕組みを作る、
という意味に取り違えてました。
#ひょっとするとそういうものもキャッシュしてくれてるのかな?
Yasushi Shinjoさんの<YAS.04Fe...@kirk.is.tsukuba.ac.jp>から
> Redirect するとなんとかいけそーな気もします。
なるほど。
ErrorDocument ディレクティブでやる方法を思いつきました。
401 Not Found なときに、CGIを起動させてやれば良さそうです。
ErrorDocument 401 image_output.cgi
みたいな。
ただ名称不定さんがおっしゃるように、DB内のファイルが更新され
たときに実ファイルの内容を保証するためには、必ず CGIを通して、
ファイルの日付をチェックしたほうがいいかもしれませんね。
その場合は、実ファイルは実際には別の場所に置いといて、一旦 CGI
を通してファイルの日付をチェックした後に URLをそっちに書き換え
る、といいかもです。どの程度のパフォーマンスが出るかは不明です
が。