2

さて、画像を提供してキャッシュする方法についてのアイデアがあります。これが正しい方法かどうかはわかりませんが、正しい場合は、虐待を防ぐ方法を知りたいです。

状況:

index.php

<img src="images/cache/200x150-picture_001.jpg" />

画像/キャッシュ/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ images/image.php?f=$1 [L]

上記は画像が存在するかどうかを確認し、存在しない場合は image.php に書き換えられます

image.php PSEUDO コード

ファイル名から高さと幅を取得する

画像のサイズを変更してキャッシュ フォルダーに保存する

content-type と readfile を使用して画像を提供します。

このようにして、readfiles を使用して HTTP リクエストと PHP の負荷を軽減しようとしています。ブラウザは、イメージ/jpeg が存在する場合は取得し、存在しない場合は生成されます。

最終的には、すべての画像がキャッシュされ、適切な高さと幅で提供されるため、ブラウザーが大きすぎる画像をダウンロードすることはありません。

唯一の問題は、画像の URL を別のサイズに変更すると、サーバーがいっぱいになる可能性があることです。

私はそれを正しくやっていますか、それを行う正しい方法は何ですか。これが起こるのを止める可能性はありますか?

このキャッシングの概念全体が何百万回も洗練されてきたことを知っています。教えてください。

4

4 に答える 4

2

答えが遅すぎないかどうかはわかりませんが、そのためにSLIR (Smart Lencioni Image Resizer)を簡単に使用してみませんか? 必要なことは何でもできるので (キャッシングとキャッシュ管理を含む)、ドロップインして使用するだけです。

于 2012-08-02T05:50:12.177 に答える
1

いくつかのアプローチ:

  • 許可された解像度の配列を維持し、要求された解像度がその配列にあるかどうかを確認します。欠点: 配列を編集せずに解像度をすばやく追加することはできません。

  • これが CMS コンテキストにある場合:認証されたユーザーのみが新しいイメージ (まだキャッシュにない) の作成を許可します。それ以外の場合はリクエストを拒否します。認証されたユーザーが CMS に画像を追加すると、プレビューが表示され、サイズ変更された画像が生成されます。欠点: 完全に実装するのは簡単ではありません。

于 2012-06-23T11:23:02.043 に答える
1

キャッシングは明らかに重要な問題です。あなたのソリューションは合理的に見えますが、実際には意図的および意図的でないサービス拒否攻撃に対してオープンです。また、画像が変更されたときに何が起こるかについても触れていません。サイズ変更されたすべての画像をキャッシュから削除するにはどうすればよいでしょうか。「ダウンストリーム」キャッシュを許可するようにキャッシュ ヘッダーを設定しません。キャッシュ全体が同時にフラッシュされるリスクに対処していないため、HTTP 要求のコンテキストですべての画像を再生成する必要があり、パフォーマンスが大幅に低下する可能性があります..

Apache のキャッシング モジュールなどの「既製の」ソリューションを見たことがありますか?

于 2012-06-23T11:24:55.350 に答える
0

私はただします:

<img src="/thumbnail.php?thumb=mybigpicture.ext" ... />

そして、これが私がそれを行う方法です。この実装は、画像の幅が高さよりも幅が広いか、またはその逆であるかに関係なく、画像をスケーリングし、ほとんどの PHP の試みとは異なり、適切なスケーリングを行うことに注意してください。

<?php

function thumb_image($request = "") {
  $cfgthumb['folder'] = "/images/cache";
  $cfgthumb['height'] = 150;
  $cfgthumb['width'] = 200;
  $cfgthumb['error'] = "/images/error.jpg";
  $cfgthumb['default'] = "/images/notfound.jpg";

  $thumb = $cfgthumb['folder'] . "/" . md5($request);
  header("Content-Type: image/jpeg");
  if (is_readable($thumb)) echo file_get_contents($thumb);
  elseif (is_readable($request)) {
    $extension = strtolower(end(explode(".", $request)));
    switch ($extension) {
    case "gif":
      $simage = imagecreatefromgif($request);
      break;
    case "jpeg":
    case "jpg":
      $simage = imagecreatefromjpeg($request);
      break;
    case "png":
      $simage = imagecreatefrompng($request);
      break;
    }
    if ($simage) {
      $simage_width = imagesx($simage);
      $simage_height = imagesy($simage);
      if (($simage_width > $cfgthumb['width']) || ($simage_height > $cfgthumb['height'])) {
        if ($simage_width > $simage_height) {
          $dimage_width = $cfgthumb['width'];
          $dimage_height = floor($simage_height * ($cfgthumb['width'] / $simage_width));
        } else {
          $dimage_width = floor($simage_width * ($cfgthumb['height'] / $simage_height));
          $dimage_height = $cfgthumb['height'];
        }
      } else {
        $dimage_width = $simage_width;
        $dimage_height = $simage_height;
      }
      $dimage = imagecreatetruecolor($dimage_width, $dimage_height);
      imagegammacorrect($simage, 2.2, 1.0);
      imagecopyresampled($dimage, $simage, 0, 0, 0, 0, $dimage_width, $dimage_height, $simage_width, $simage_height);
      imagegammacorrect($dimage, 1.0, 2.2);
      imagejpeg($dimage, $thumb, 100);
      imagejpeg($dimage, NULL, 100);
      imagedestroy($simage);
      imagedestroy($dimage);
    } else echo file_get_contents($cfgthumb['error']);
  } else echo file_get_contents($cfgthumb['default']);
}

?>
于 2012-06-23T11:49:55.247 に答える