2

そのため、フォト ギャラリーを表示するためにログインが必要なサイトがあります。これらの写真を保護するために、それらを Web ルートの外に移動し、php スクリプトを使用して表示しました。このようなもの。

フォトギャラリー.php

echo '<img src="photo.php?id=X"/>';

写真.php

$id = (int)$_GET['id'];

$photo = getPhotoDataFromDb($id);
$path  = DIRECTORY.basename($photo['filename']);

// Make sure photo file exists
if (!file_exists($path) || !is_file($path))
{
    logError(__FILE__.' ['.__LINE__.'] No photo found in directory ['.$path.'] for photo id ['.$id.'].');
    header('HTTP/1.0 404 Not Found');
    return;
}

$info = getimagesize($path);

header("Cache-control: public, no-cache;");
header("Content-type: ".$info['mime']);

readfile($path);

Web ルート内のディレクトリから写真を通常どおり表示するよりも6倍から7倍遅いことを除いて、すべて正常に動作します。

だから、私の質問は次のとおりです。

  1. 私のコードに何か問題がありますか、またはこの方法は常により多くの時間を追加しますか?
  2. どうすればスピードアップできますか?画像を安全にキャッシュする方法はありますか? ギャラリー 2 はこれを何らかの方法で行っていると思います。
4

5 に答える 5

4
  1. はい、あなたの方法は時間を追加します。画像をループの外に置くことで、各画像をメモリにバッファリングしてからユーザーに送信することで、サーバーの負荷が増加し、大きな画像の顕著な遅延が発生します(ここでギャラリーを想定)。 .

  2. ウェブサイト/アプリのルートに画像を配置することで、これを高速化できます。画像をリモート ホットリンクから保護するには、htaccessスクリプトを使用するだけです (Google で検索してください)。とログイン許可の組み合わせを作成して、htaccess承認されていないユーザーが画像を含むフォルダーにアクセスできないようにすることもできます。

参考文献:

于 2012-04-12T13:31:48.573 に答える
1

画像は、readfileではなく、ファイルから直接提供する必要があります。

于 2012-04-12T13:13:40.737 に答える
1

多くの場合、getimagesize(); 何年もかかります。それを避けて、速度の違いがあるかどうかに注意してください。

これはリモート イメージで最も頻繁に発生するため、同じ問題が発生しているとは限りません。

于 2012-04-12T13:17:01.607 に答える
1

https://tn123.org/mod_xsendfile/をご覧ください

sendfile は、コードで直接行うよりもファイルを返す方がわずかに速いことがわかりました。

于 2012-04-12T13:32:42.613 に答える