サーバの負荷と、phpの作りにつきまして。


1時間に数千回アクセスのある画像が数千枚あるとします。
(中には数十回しかアクセスが無い画像もあります)

これら全てが、最後の更新から1時間を経過していた場合は、
画像を更新したいと考えております。
(例えば、画像に更新時刻を合成する等)

これらの条件がある中で、サーバに対して、
できる限り負荷を少なくする一番のお勧め方法を教えて下さい。


<img src="hoge.php" /> として呼び出させて、
通常は hoge.jpg を読み込んで表示し、
最終更新時刻から1時間が経過していたら更新してから読み込んで表示する。
と、考えたのですが、凄く無駄な気がします。

そこで、<img src="hoge.jpg" /> として呼び出させて、
.htaccess か何かで、画像を返す前に、最終更新時刻をチェックし、
1時間が経過していた場合のみ、hoge.jpg を表示する前に更新する、
という事はできないのかな?とも思いました。

これ以上の事は想像がつきません。

一般的な共用レンタルサーバ(SAKURA)ですので、
サーバの設定を変える等は難しいです。

phpでしたら、少しは書けます。

お勧めの方法を教えて下さい。

よろしくお願い致します。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/10/28 19:05:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント100pt

http://httpd.apache.org/docs/2.2/rewrite/advanced.html#on-the-fly-content

We wish to dynamically generate content, but store it statically once it is generated. This rule will check for the existence of the static file, and if it's not there, generate it. The static files can be removed periodically, if desired (say, via cron) and will be regenerated on demand.

cronで定期的にチェックして期限が過ぎたら消し、リクエストがあったらファイルがあるかチェックして、あればそのまま表示、なければ生成・保存・リダイレクトするphpへ転送する、という方法になります。
2.2でも使えるのでsakuraでもOKなんじゃないかと思います。

[追記]
1ディレクトリ1ファイルになってしまいますが、

  • .htaccessで画像生成スクリプトへリダイレクトしておく
  • 画像生成スクリプトへリクエストが回ってきたら画像を生成すると同時に.htaccessをリネームして退避
  • cronで.htaccessの存在をチェックし、なければ画像生成時刻をチェックして1時間以上古ければ.htaccessを復帰

ってのでも良い気がしました。
こちらの方が画像有効時に余計な条件チェックがないので負荷が低いと思います。

あと、mod_expiresも使えるそうですので設定もお忘れ無く。
http://httpd.apache.org/docs/2.2/ja/mod/mod_expires.html

他1件のコメントを見る
id:TransFreeBSD

今更ですが……

RewriteCond %{REQUEST_URI} !-U

は、.htaccessで、相手が静的ファイルなので、

RewriteCond %{REQUEST_FILENAME} !-f

と出きるんじゃないかと思います。こちらの方が負荷が低くなります。

2014/10/23 21:33:23
id:worldtravel

ありがとうございます。

時間ができ次第、試してみます。

2014/10/24 21:20:37
  • id:psne
    cronが使用できるので、画像ファイルの更新時間を利用して別途更新するという方法があります。
  • id:worldtravel
    ありがとうございます。

    それも考えたのですが、更新する必要の無い画像も更新しなければならないので
    避けたいと考えています。

    数時間アクセスが無い画像もかなりあり、それはそのまま放っておいて構いません。

    5時間、6時間後にでもアクセスがあった際に、更新を行いたいのです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません