運営管理している掲示板サイトが重たい。
- 評価
- クリップ 2
- VIEW 1,333
前提・実現したいこと
とある掲示板サイトを個人で運営管理しています。
ユーザー数は平均で1日で300人ほどで、
1時間でだいたい書き込みがざっくりですが1000~2000件ほどです。
アクセスが集中しがちな時間帯になると、書き込みが見れるページだけが
重たくなるので、そこを改善したいです。
少ない情報で申し訳ないのですが、
一般的な具体的な改善案や、試した事に対しても効果の有無や
問題があればご指摘頂きたく思います。
発生している問題・エラーメッセージ
アクセスが集中しがちな時間帯になると、
書き込みが見れるページだけが重たくなる。
長い時で読み込みに30秒~1分かかる場合もあります。
該当のソースコード
投稿が書き込まれたデータベースを読み込んで、
表示する処理はだいたいこのような感じです。
//ブロック情報の取得
$UserBlockList = GetBlockList($dbBlock, $MyUserID);
foreach ($db->query( "SELECT * FROM 投稿一覧 WHERE スレッドID = '$TID' ORDER BY ROWID DESC" ) as $row) {
//ここで投稿者のユーザー情報の取得
$UserInfoArray = GetUserInfo($dbProf, $row['投稿者ID']);
//ブロックチェック!!
if( $BlockUserIDList != null ){
if( isset($BlockUserIDList["{$row['投稿者ID']"]) ){
continue;
}
}
echo "<div class\"contents\">
//省略していますが、ここで
//投稿情報(時間、投稿本文)ユーザー情報(ユーザー名、プロフアイコン)
//を表示しています。
</div>";
}
試したこと
■データベースの分割。
元々たった1つのデータベースで管理していたので、そこが原因ではないかと思い、
およそ100MBのデータベースを1~3MBほどの複数のデータベースに分けました。
(少し効果があったような気はするがまだ重たい)
■ページの分割
A.phpという書き込み閲覧ページを、A1.php,A2.php,A3.phpといった具合に
複製し、当掲示板内固有のユーザーIDで判別しアクセスするページを分けています。
※例.ユーザーID(1~100)はA1.phpで閲覧ください。的な感じです。
(結局共通してincludeしているphpファイル(API)があるので意味なかったように感じます
この場合includeしているファイルも複製し分ける事で改善するのでしょうか?)
■広告数の減らした。
広告を10枠ぐらい書き込みと書き込みの間に、
ランダムな位置に表示させていたのを、
「アイモバイル(広告媒体)」
Webアイコン広告1枠(icon x 4)
バナー1枠(256x64ぐらいのやつ)
四角のでかいやつ1枠(256x256ぐらい)
までに減らしました。
(あまり効果は無かったように感じます)
補足情報(言語/FW/ツール等のバージョンなど)
■システム・環境
システムは主にPHPで設計しており、データベースはSQLiteを使用しています。
サーバーは共有サーバーのレンタルサーバーロリポップで一番高いプラン。
私個人の技術はWebプログラム経験は独学レベルで2年ほどで、扱えるのはPHPだけです。
■1日のアクセス状況
リクエスト成功件数 383093 件
リクエスト成功件数の日別平均 209196 件
ページリクエスト成功件数 54 件
ページリクエスト成功件数の日別平均 28 件
ステータスコード不在ログ行数 -
リクエスト不成功件数 53111 件
リダイレクトされたリクエスト件数 - 件
ステータスコードつきリクエスト数 -
異なるリクエストファイル数 41796 ファイル
異なるサービスホスト数 1347 件
異常ログ行数 -
不必要ログ項目数 17015
データ転送量 4899015336 バイト
データ転送量の日別平均 2675230217.610921 バイト
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
共有サーバでは原因の追究も難しいですから、
ローカルに開発/検証環境を作って原因を特定できる環境を作ることをお勧めします。
原因を推測出来る情報が足りないので以下は勘も交えての回答です。
[原因]
DBの処理が追いついていない状況に見えます。
DB構造などを見直すのが筋ですが、SQLiteだとそのあたりも限界がありそうです。
(すみません、SQLiteについてはあんまり詳しく無いです。)
[対応その1]
もし、データ表示のタイミングでアクセスをDB書き込みなどしているなら、
SQLiteのロックの仕組み的にはそれを無くすことで早くなるはずです。
[対応その2]
また、恐らく、MySQL等に変更して適切にDB設計すればパフォーマンスは改善すると思います。
*SQLite自体のパフォーマンスが悪いという事ではありません。
[対応その3]
他に確実にパフォーマンスを上げる方法としては、
・読み込みデータのキャッシュ化
があります。
キャッシュの方法はいくつかありますが、例えば
・混雑する時間帯はデータをリアルタイムに表示するのではなく、5分に一度だけ更新して静的なファイルとして出力する。ユーザはその静的なファイルを見る
という形にすればDBに対する読み込み負荷は激減するはずです。
この場合はテンプレートエンジンを導入して、そのキャッシュ機能を使えば比較的簡単に出来るはずです。
広告に関してはajax等で動的に更新するようにするなど工夫が必要です。
もっと賢くするのであれば
・SQLに対応するデータをシリアライズしてファイルに格納しておき、最後にアクセスされた状態からn分以上経過してからアクセスされた場合だけ新たにDBからデータを取得する
という様な実装になります。
これは自力で実装してみるのも楽しいですが、
参考
といったライブラリを使うと楽です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
遅くなっている原因の特定をまず初めにするべきではないでしょうか?
データベースの処理が遅いのか、PHPの処理が遅いのか、通信速度が遅いのかでやることは違ってきます。
それぞれの処理時間を記録する方法をまず探してみてはいかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
広告的にどうなのかわかりませんが、表示をajax化し最新情報を自動更新するようにすれば、パフォーマンスは劇的に改善されると思います。
PVも激減するはずですが。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/19 01:00
特にその3に関しては今すぐ実装したいくらいです!!
早速試してみようと思います!ありがとうございました!