LAMP環境にて、お店の口コミサイトを構築する事となりました。
1画面で多数の画像を表示する必要があるのですが、アクセス見込みが1日数万PVと非常に多く、自分が知っている実装で処理に問題は無いか、と不安になり質問させていただきました。
今まで、PHPで画像を表示する時に実装してきた方法は以下のような流れです。
(説明を簡略化するために、1店舗につき画像は1枚のみとしています。)
- 店舗テーブルを作成
table_shop
id | shop_name |
---|---|
1 | 居酒屋A |
2 | 居酒屋B |
3 | 居酒屋C |
- 店舗に紐づく画像テーブルを作成
table_image
id | shop_id | key | extension |
---|---|---|---|
1 | 1 | aaaaaaaa | jpg |
2 | 2 | bbbbbbbb | png |
3 | 3 | cccccccc | png |
-
画像ファイルは、サーバ上に「{table_image.id}.{table_image.extension}」というファイル名で保存しておく
-
店舗一覧ページで、以下のようなSQLを発行してデータを取得
sql
1SELECT 2table_shop.id, 3table_shop_shop_name, 4table_image.key 5FROM table_shop 6LEFT JOIN table_image 7ON table_shop.id = table_image.shop_id;
- 取得したデータを$dataに格納、foreachでループして店舗一覧を画像付きで表示
php
1<ul> 2<?php foreach ($data as $value) : ?> 3<li> 4店舗名:<?php echo $data['shop_name']> 5店舗写真:<img src="image.php?key=<?php echo $data['key']>"> 6</li> 7<?php endfireach;?> 8</ul>
- image.php側で、受け取ったGETパラメータ(key)を元に、以下のようなSQLで画像IDを取得
sql
1$sql = 'SELECT id,extension FROM tbl_image WHERE key=?'; 2
- image.php側で、取得した画像データから以下のようなコードで画像を表示
php
1$file_path = '/'.$data['id'].'.'.$data['extension']; 2 3if(file_exists($file_path)){ 4 header('Content-Type: application/force-download'); 5 header('Content-Length: '.filesize($file_path)); 6 header('Content-Disposition:attachment;); 7 readfile($file_path); 8}
以上のような実装です。
この実装ですと、1画面に表示する画像の数だけimage.phpが走る事になり、サーバへの負担が非常に大きくなるのではと心配しています。
自分が考えられる対処方法としては、画像をblob型でMYSQLに保存すれば、サーバへのファイルアクセス自体は無くなるので少しは負担が減るかな、思いました。
どのような設計が適切か、また設計の参考になるサイトがありましたら、教えていただけませんでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。