0

重複の可能性:
phpで生成されたギャラリーのサムネイルの読み込みが遅い

コードリンクはページの下部にあります。

このサイトは1and1.co.ukLinuxベースのシステムから実行されており、現在よりもはるかに高速にギャラリーをロードするのに十分です。

PHPで生成されたサムネイルの読み込みが少し遅いのですが、その理由を教えてください。

http://site-perf.com/cgi-bin/show.cgi?id=vz5le19Fp5E

コード: http ://satinaweb.com/tmp/functions.txt

ここにありcrop.phpます:

$sourceimage = $_GET['a'];

function crop($sourceimage) {
    // Draw & resize
    header('Content-Type: $imsz[\'mime\']');

    list($width, $height) = getimagesize($sourceimage);

    if($width > $height){
        $new_width = 100;
        $new_height = 75;
    } else {
        $new_width = 75;
        $new_height = 100;
    }

    $image = imagecreatefromjpeg($sourceimage);
    $image_p = imagecreatetruecolor($new_width, $new_height);

    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagejpeg($image_p);
    imagedestroy($image_p);
    imagedestroy($image);
} 

crop($sourceimage);

ご不明な点がございましたら、お問い合わせください!

4

2 に答える 2

3

サイト パフォーマンス グラフから最も注目すべき点は、

すべてのコードを調べるつもりはありませんが、crop.php. これは、(おそらく) ページが読み込まれるたびに画像をトリミングするため、遅くなります。これには比較的長い時間がかかります (サイトのパフォーマンス データから明らかです)。リクエストごとに、ブラウザはほとんどの時間をサーバーからの応答を待つことに費やします。

キャッシュ フォルダーを使用してトリミングされた画像を保存し、読み込み時間を短縮するためにそのまま提供することを検討する必要があります。

ではcrop.php、次のようなことを行うことができます (疑似コード):

IF original image newer than cropped OR cropped doesn't exist
    Load original image
    Crop original image
    Save cropped image to cache folder
ELSE
    Serve already-cropped image from cache
ENDIF

を呼び出すたびcrop()に、画像を読み取り、変更して、クライアントに吐き出します。リクエストごとに画像を再処理する必要があるため、これは非常に無駄です。後で画像を破壊することさえあります(これが大きな違いを生むわけではありません)。代わりにis_file()、キャッシュ ディレクトリを使用して、イメージをディスクに保存し、クライアントに送信します。

これで、スクリプトは次のようになります。

$sourceimage = $_GET['a'];

$cache_dir = dirname(__FILE__) . "/cache";        // Cache directory
$cache_file = $cache_dir . '/' . $source_image; // Path to cached image

function crop($sourceimage) {
    header('Content-Type: $imsz[\'mime\']');

    // If cached version of cropped image doesn't exist, create it
    if(!is_file($cache_file)) {     
        list($width, $height) = getimagesize($sourceimage);

        if($width > $height) {
            $new_width = 100;
            $new_height = 75;
        } else {
            $new_width = 75;
            $new_height = 100;
        }

        $image = imagecreatefromjpeg($sourceimage);
        $image_p = imagecreatetruecolor($new_width, $new_height);

        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

        imagejpeg($image_p, $cache_file);   // Save image file to disk
    } else {    // If cached file exists, output to browser without processing
        echo file_get_contents($cache_file);
    }
} 

crop($sourceimage);

これはテストされていませんが、動作するはずです。上記のコードをそのままコピー アンド ペーストしないでください。それを読んで、どのように、なぜそれが何をするのかを理解してください。

于 2012-07-08T15:32:30.147 に答える
0

HTTP リクエストがキューに入れられているため、ページの読み込みに時間がかかっています。

各画像は小さいですが、リクエストはキューに入れられた時間の大部分を費やしており、開始前に他のリクエストが完了するのを待っています。最悪の場合、ダウンロードを開始する前に 1.5 秒も待機しています。

2 番目の遅延は、イメージの作成にかかる時間によって発生します。

これらの他のプロセスを待った後、実際のダウンロードはほぼ瞬時に行われました。

  1. キューに入れられた 1600 ミリ秒
  2. 待機中 986ms
  3. ダウンロード 0ms

毎回正しいサイズの画像を生成するのではなく、結果を保存して次回のアクセスで使用しないでください。これは、ページが一度遅くなり、それ以外の場合はずっと速くなることを意味します。

スクリプトが画像をトリミングするのにかかる時間が短縮された場合、キューイングも短縮されます。ここに例があります...

  1. トリミングされた画像のフォルダーをチェックインする
  2. 存在する場合は、それを提供します (計算は必要ありません)。
  3. 存在しない場合は生成する
  4. 結果をフォルダに保存してキャッシュします
于 2012-07-08T15:38:31.420 に答える