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

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

新規登録して質問してみよう
ただいま回答率
85.49%
SQLite

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

Webサーバー

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

Webサイト

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

PHP

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

Q&A

解決済

3回答

1995閲覧

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

ogawayohei

総合スコア13

SQLite

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

Webサーバー

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

Webサイト

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

PHP

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

0グッド

2クリップ

投稿2016/05/18 13:51

編集2016/05/18 14:06

###前提・実現したいこと
とある掲示板サイトを個人で運営管理しています。
ユーザー数は平均で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 バイト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2016/05/18 15:29

tanat

総合スコア18711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogawayohei

2016/05/18 16:00

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

0

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

投稿2016/05/18 14:07

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogawayohei

2016/05/18 14:12

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

0

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

投稿2016/05/18 13:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogawayohei

2016/05/18 14:01

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

退会済みユーザー

2016/05/18 14: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処理)は同じ仕組です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問