個々のサムネイルに別々のリクエストや個別のクエリが必要な理由はありません。 1つのリクエストと1つのクエリで両方を実行できます。
サムネイルがデータベースにURLとして保存され、アルバムIDに関連付けられているとします。これは、このような単一のクエリがアルバムのすべてのサムネイルを取得できることを意味します。
SELECT
thumbnails.url
FROM
thumbnails
JOIN
albums ON thumbnails.album_id = albums.id
WHERE
thumbnails.album_id = 1
これらの結果にページを分けて、サーバー負荷を軽減することができます。 1ページに50サムネイルを読み込みたいとします。その後
SELECT
thumbnails.url
FROM
thumbnails
JOIN
albums ON thumbnails.album_id = albums.id
WHERE
thumbnails.album_id = 1
LIMIT
0,50
あなたがLIMIT 50,50
を行うことができ、次のページ、次のページLIMIT 100,50
用などなど。
サムネイル結果のリストをJSONとしてAJAXレスポンスでクライアントに送り返すことができ、クライアントはjavascriptを使用して各サムネイルをページに読み込むことができます。その後、あなたはおそらくあなたの思考はあなたがPHPは、ユーザがアルバムを表示するアクセス権を持っていることを確認したいので、あなたが、これらのサムネイルのための個別の要求を持っている必要があるということであるならば、これは
を動作しませんだと思うのはなぜ
、一度に2つの多くの問題を解決するのが難しいです。
サムネイルURLをクライアントに取得する際の問題は、1つのステップです。これは、ユーザーの$_SESSION
を確認することで簡単に実行できます。クエリを実行してJSON結果を返信する前に、album_id
にアクセスできるようにしてください。
次のステップでは、アルバムとそのサムネイル画像へのアクセスを制限しています。残念なことに、HTTP/1.1でこれを別にリクエストする必要があります。その周りに道はない、しかし、これはまだ高価である必要はありません。
あなたは、単にだけ$_SESSION
変数が必要なalbum_id
チェックが含まれていることを確認し、クライアントに実際の画像をアップサービス提供に対処するためにあなたのウェブサーバのSendfile capabilitiesに依存するPHPを使用しています。
PHPは、ユーザーがイメージを表示するためのアクセス権を持っているかどうかを検証する部分だけを処理します。そしてあなたのウェブサーバは、それを提供する部分を処理します。このリクエストにはデータベースクエリは実行されません。したがって、データベースの負荷の懸念ではありません。
PHPでは、Apache httpd(例として)を使用すると、これは次のように動作します。これは何
if (isset($_SESSION['album_id']) && $_SESSION['album_id'] === $_GET['album_id']) {
// User has access
header("X-Sendfile: " . $pathToImageOnFileSystem);
exit;
} else {
// User is not authorized :/
echo "Unauthorized access!";
}
は「あなたがクライアントに$pathToImageOnFileSystem
で指定されたファイルを提供する必要がある」それは知っているように戻ってあなたのWebサーバへの応答ヘッダを送信しています。 PHPの役割は、そのヘッダをWebサーバに送り返した後に終了します。その後、Webサーバーは残りの処理を行います。だから、PHPは結ばれていません。
難しい部分は、ファイルシステム上のファイルにマップできるイメージIDのURLを指すようにWebサーバーの書き換えルールを定義することです。たとえば、画像を/home/myapp/images/{album_id}/{image_id}
に保存して、http://www.example.com/images/1/1などのURLがWebサーバーで読み取られ、PHPに送信された場合、PHPは$pathToImageOnFileSystem
が/home/myapp/images/1/1
であると判断することができます。 PHPはすでにユーザがアクセスしているかどうかを知っています。これは、albumb_idが$_SESSION
であることを確認することによって、以前の認証からそれらが保存されているためです。
もちろん、あなたのWebサーバーがサービスを提供するときに、ファイルが正しいMIMEタイプとファイル拡張子を返すようにすることもあります。したがって、/home/myapp/images/{album_id}/{image_id}
を/home/myapp/images/{album_id}/{image_id}.*
またはそれに似たものにマップすることができます。
代わりに認証を使用するのはなぜですか?一度にアルバム全体を読み込むのではなく、ページ分割で自由にアルバムや写真をブラウズできるようにする。すべてのリクエストを確認する必要があるのは、ユーザーがリソースを表示できるかどうかだけです。 – Parziphal
サムネイルを使いたいので、すばやく目的の写真に移動できます。私は、画像の場所のリストを取得するための自動化のチェックのみを議論しており、画像としてリソースとしてアクセスできるようにしています。どのくらいのサーバー時間を節約し、あいまいさによるセキュリティがこれまで最高の選択肢ではないかを知ることはできません。 – user2381309
これは、Facebookがしていないものでもありますので、再検討する必要があります。いずれにしても、負荷はイメージを読み込んでユーザーに送信する必要があるため、MySQLよりもPHPにかかると考えられます。それでもデータベースについて懸念がある場合は、MongoDBの使用を検討してください。 – Parziphal