質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    20749questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Webサイト

    1095questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • SQLite

    636questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Webサーバー

    448questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

運営管理している掲示板サイトが重たい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 579

ogawayohei

score 5

前提・実現したいこと

とある掲示板サイトを個人で運営管理しています。
ユーザー数は平均で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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

共有サーバでは原因の追究も難しいですから、
ローカルに開発/検証環境を作って原因を特定できる環境を作ることをお勧めします。

原因を推測出来る情報が足りないので以下は勘も交えての回答です。

[原因]
DBの処理が追いついていない状況に見えます。

DB構造などを見直すのが筋ですが、SQLiteだとそのあたりも限界がありそうです。
(すみません、SQLiteについてはあんまり詳しく無いです。)

[対応その1]
もし、データ表示のタイミングでアクセスをDB書き込みなどしているなら、
SQLiteのロックの仕組み的にはそれを無くすことで早くなるはずです。

[対応その2]
また、恐らく、MySQL等に変更して適切にDB設計すればパフォーマンスは改善すると思います。
*SQLite自体のパフォーマンスが悪いという事ではありません。

[対応その3]
他に確実にパフォーマンスを上げる方法としては、
・読み込みデータのキャッシュ化
があります。
キャッシュの方法はいくつかありますが、例えば
・混雑する時間帯はデータをリアルタイムに表示するのではなく、5分に一度だけ更新して静的なファイルとして出力する。ユーザはその静的なファイルを見る
という形にすればDBに対する読み込み負荷は激減するはずです。
この場合はテンプレートエンジンを導入して、そのキャッシュ機能を使えば比較的簡単に出来るはずです。
広告に関してはajax等で動的に更新するようにするなど工夫が必要です。

もっと賢くするのであれば
・SQLに対応するデータをシリアライズしてファイルに格納しておき、最後にアクセスされた状態からn分以上経過してからアクセスされた場合だけ新たにDBからデータを取得する
という様な実装になります。
これは自力で実装してみるのも楽しいですが、
参考
といったライブラリを使うと楽です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/19 01:00

    ほぇええええええええ!!!めちゃめちゃ勉強になります!
    特にその3に関しては今すぐ実装したいくらいです!!
    早速試してみようと思います!ありがとうございました!

    キャンセル

+1

遅くなっている原因の特定をまず初めにするべきではないでしょうか?
データベースの処理が遅いのか、PHPの処理が遅いのか、通信速度が遅いのかでやることは違ってきます。
それぞれの処理時間を記録する方法をまず探してみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 23:12

    ご回答ありがとうございます!
    そですね;;実は正直な所どこが原因になっているのかがさっぱりでして;;;
    処理時間を記録する方法…片っ端から試してみます;;

    キャンセル

0

広告的にどうなのかわかりませんが、表示をajax化し最新情報を自動更新するようにすれば、パフォーマンスは劇的に改善されると思います。
PVも激減するはずですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 23:01

    回答ありがとうございます!
    ajax化で劇的に改善するとは…それも視野にいれないと駄目なのかもしれませんね;;

    キャンセル

  • 2016/05/18 23:18

    用途が違うので参考になるか微妙ですが、
    1日のユーザ数:700-1300
    1日の投稿数:約30,000
    1日のPV:8000-12000

    サーバサイドをPHPで作って、ajax使って5分間自動更新させることで、
    AWS EC2のt2.small(vCPUX1、mem 2GB)1インスタンス
    で動いてるので、だいぶ軽くなるかと。(その分PV激減ですが)

    投稿は同じサーバで動いているAPI的なものに直接するものもあるので、ブラウザのPVにカウントしていないものも多いのですが、投稿処理(DB処理)は同じ仕組です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20749questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Webサイト

    1095questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • SQLite

    636questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Webサーバー

    448questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。