2016-09-08 2 views
1

私は、パスワードで保護されるサムネイルで検索可能な写真アルバムを共有できるサイトを作っています。私の計画は、パスワードを認証し、PHPセッションをフォトアルバムのIDと同じにすることでした。次に、ユーザーがアルバムを読み込むと、サーバーはすべての画像参照IDのリストを提供します。 ajax呼び出しを使用すると、クライアントは写真IDを含むGETリクエストを使用して要求基準を満たすすべての画像を要求します。 PHPを使用して、現在のセッションがそのアルバムに対して承認されているかどうかを確認し、次にピクチャの場所のMySQLクエリを作成してからピクチャを返します。パスワードで保護された写真アルバムPHP/MySQLサーバロード

私のデザインアイデアを読んだので、サムネイルごとに別々のリクエストとMySQLクエリが必要になるため、アルバムが十分に大きければサーバーのローディングが急増することに懸念しています。私は実装とテストをまだしていませんが、私の設計をやり直すべきかどうかを知りたいと思っていました。

これについてもっと良い方法がありますか?

シンプルなPHPスクリプトとMySQLクエリからの読み込みは非常に大きいでしょうか?

+0

代わりに認証を使用するのはなぜですか?一度にアルバム全体を読み込むのではなく、ページ分割で自由にアルバムや写真をブラウズできるようにする。すべてのリクエストを確認する必要があるのは、ユーザーがリソースを表示できるかどうかだけです。 – Parziphal

+0

サムネイルを使いたいので、すばやく目的の写真に移動できます。私は、画像の場所のリストを取得するための自動化のチェックのみを議論しており、画像としてリソースとしてアクセスできるようにしています。どのくらいのサーバー時間を節約し、あいまいさによるセキュリティがこれまで最高の選択肢ではないかを知ることはできません。 – user2381309

+0

これは、Facebookがしていないものでもありますので、再検討する必要があります。いずれにしても、負荷はイメージを読み込んでユーザーに送信する必要があるため、MySQLよりもPHPにかかると考えられます。それでもデータベースについて懸念がある場合は、MongoDBの使用を検討してください。 – Parziphal

答えて

1

個々のサムネイルに別々のリクエストや個別のクエリが必要な理由はありません。 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}.*またはそれに似たものにマップすることができます。

+0

面白いことに、複数の画像を返す方法を見つけるために、1回の呼び出しですべての要求された写真を尋ねるという点で、それをさらに調べなければなりません。その意図は、誰かが写真のURLにアクセスして、許可されていない状態で写真を読み込むことを望まないということです。それは理にかなっていますか? – user2381309

+0

1回のリクエストでデータベースのすべてのデータを要求しています。 1つのリクエスト(少なくともHTTP/1.1_ではなく_)でWebサーバーから複数のイメージを取得する方法はありません。しかし、これらは全く別の2つの問題です。あなたは、データベースからデータを取得するという問題でイメージを提供するという問題を混同しているようです。これらの**は2つの別個の問題**であり、それらは別々に解決されるべきです。一回の襲撃でそれらを一緒に解決しようとすると、あなたは非常に複雑に思えるようになります。 – Sherif

+0

あなたは私のためにそれを解決したと思います。私はクライアントにURLを渡すことによって誰もがそのURLを使用できることを心配していました。しかし、リライトを使うことで、そのURLをPHPファイルで処理してから画像を返すことができました。ありがとうございました。 – user2381309

関連する問題