1

1x1最小ピクセルから最大ピクセルまで画像を読み取っています1600x1600。私は3つのPHPメソッドを作成し、完全に機能しています。

// using FGC
function output_fgc($filename)
{
    header("Content-Type: image/png");
    echo file_get_contents($filename);
}

// using fopen
function output_fp($filename)
{
    $handle = fopen($filename, 'rb');

    header("Content-Type: image/png");
    header("Content-Length: " . filesize($filename));

    fpassthru($handle);
}

// using GD
function output_gd($filename)
{
    $im = imagecreatefrompng($filename);

    header('Content-Type: image/png');

    imagepng($im);
    imagedestroy($im);
}

パフォーマンスはすべてのメソッドで同じようです。どちらがより多くのサーバーリソースを使用しているかを知りたいだけですか?これより良い方法はありますか?前もって感謝します。

4

2 に答える 2

2

ユーザーが200x100ピクセルのプレースホルダー画像をリクエストすると、最初にGDで作成し、保存して出力します。次に同じサイズがリクエストされた場合は、保存したファイルを読み取ってブラウザーに出力するだけで、新しいものを再度作成します。

Apacheのmod_rewriteモジュールを使用できる場合は、イメージが作成されるとPHPをまったく必要としないさらに効率的なアプローチがあります。サイズ変更された画像キャッシュを作成するが乱用を防ぐを参照してください

そこから盗まれた:

HTML:

<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]

この手法は、正しいサイズ/ファイル名の画像が「キャッシュ」フォルダーに存在するかどうかを確認し、存在しない場合にのみ、PHPスクリプトを呼び出します。スクリプトは、サイズ情報(あなたが言うように)を解析し、サイズ200x100を変更して、画像を出力する必要があります。次回誰かが画像をリクエストすると、Apacheはそれを静的に提供し、プロセスのリソースを節約します。

これの唯一の欠点は、PHPスクリプトが1回だけ呼び出されるため、元のイメージが変更されても、変更がサイズ変更されたバージョンに反映されないことです。これを防ぐために、サイズ変更されたすべての画像をときどきワイプする必要がある場合があります。元の画像が変更された場合は、サイズ変更されたすべての画像を削除する必要があります。

また、PHPで画像を出力する場合は、必ずキャッシュ情報を送信してください。たとえば、PHPでHTTPキャッシュヘッダーを使用する方法を参照してください。

于 2013-03-16T15:46:31.747 に答える
0

を使用しreadfile($filename)ます。これは、phpで任意のファイルを読み取るための最良のオプションです。

function output_rf($filename)
{
    header("Content-Type: image/png");
    readfile($filename);
}
于 2020-06-09T21:57:32.947 に答える