0

私はオンザフライのサムネイルシステムを持っており、画像を提供するときにそれが可能な限り高速であることを確認するための最良の方法を見つけようとしています。現在の流れは次のとおりです。

  • ユーザーがサムネイルをリクエストthumbnails/this-is-the-image-name.gif?w=200&h=100&c=true
  • htaccessファイルはmodrewriteを使用して、このフォルダーからPHPファイルにリクエストを送信します
  • file_exists()PHPファイルは、クエリ文字列値に基づいて要求された画像をチェックします

もしそうなら:

header('content-type: image/jpeg'); 
echo file_get_contents($file_check_path); 
die();

そうでない場合は、サムネイルを作成して返します。

私の質問は、これを最適化してより高速にする方法があるかどうかです。理想的には、私のhtaccessファイルはfile_existsを実行し、そうでない場合にのみPHPファイルに送信します...しかし、クエリ文字列を使用しているため、チェックする動的URLを作成する方法はありません。クエリ文字列から実際のファイルリクエストに切り替えてから、htaccessで存在チェックを行う価値はありますか?それはもっと速くなりますか?私はクエリ文字列構文を好みますが、現在、すべてのリクエストは、存在するかどうかに関係なく画像を返すPHPファイルに送られます。

よろしくお願いします!

4

1 に答える 1

1

理論上はできるはずです。このコマンドには、ファイルの存在を確認するために使用できるRewriteCondフラグがあります。-f次のようなルールを設定できるはずです。

# If the file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

# off to PHP we go
RewriteRule (.*)   your-code.php [L,QSA]

ここでのひねりは、入ってくるパラメーターに従ってファイルに名前を付けていると想像することです-したがって、上記の例はthumbnails/this-is-the-image-name-200-100.gif. その場合は、オンザフライでテストするファイル名を生成し、代わりにそれを確認する必要がありREQUEST_FILENAMEます。これの詳細は、セットアップに固有のものです。できれば、あまり手間のかからないシステムをお勧めします。たとえば、サムネイルを のようなディレクトリ構造のファイル システムに保存すると/width/height/filenamemodified-filename-width-height.gif.

まだチェックしていない場合は、Apache の mod_rewrite ガイドに適切な例がたくさんあります。

UPDATE :そのため、実際には動的ファイル名を見た目から確認する必要があります。このようなことを行う最も簡単な方法は、生成したファイル名を次のように環境変数に貼り付けることだと思います(他の質問から借りて、これを具体化しました):

# generate potential thumbnail filename
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))

# store it in a variable
RewriteRule .* - [E=thumbnail:%1-%2-%3-%4-%6.jpg]

# check to see if it exists
RewriteCond %{DOCUMENT_ROOT}/path/%{ENV:thumbnail} !-f 

# off to PHP we go
RewriteRule (.*)   thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6 [L,QSA]

これは完全にテストされておらず、確実に動作しない可能性があります。他にもいくつかお勧めします。

また、可能であれば、ロギングをオンにRewriteLogLevelして高レベルに設定することをお勧めします。書き換えルールのログはかなり複雑になる可能性がありますが、何が起こっているかを確実に把握できます。これを行うにはサーバー アクセスが必要です。思い出すと、ロギング構成を .htaccess ファイルに入れることはできません。

于 2011-06-14T18:25:22.227 に答える