偽カード帳ですが、やっぱり結構バグだらけですね…(汗)
自分で気づいただけでもバグがこんなにあるんで…。
・累積枚数のカウントができていません。
・過去の投稿のカード効果が表示されていません。
・リンク元が表示できていません。
・トップページに履歴が表示できていません。
ちょっと直すのにしばらく掛かりそうな雰囲気です…(冷汗)
今回の改修のメインは、一番システムの中で重たそうな部分であるログチェックをすっ飛ばせるよう
にしてみました。
以下は中の仕組みを暴露してみますが…(興味のない方には申し訳ありません。)
1月中旬までは半年ほど放置していたのですが、末期には約1万近いユニークアクセスを1個のログ
で処理していたのです。これは1行で1アクセスを処理しているのですが、21時台以降になると、毎回
8000〜10000近いデータを読み込ませて、総当たりチェックをかけるような状況だったのです。
# 勿論2回目以降のアクセスは読み込み用のログには残らない仕組みなのですが。
ちなみに22時台とは、時間辺り推定1000〜2000程度はアクセスがある時間帯です。
初めの規模を想定していなかったのが原因とはいえ、我ながら恐ろしい話です。
で、小手先で対処させたのですが、ログをある程度(IPアドレスの頭の部分で振り分けて)分散
させて、300分割程度になるよう試してみました。
これでも目に見えませんが、多少は負荷が軽くなったはずだと思います。
一応今回の大規模改修で、完全な乱数を使用してカードを抽選していた部分を、乱数を使わず
ランダムな数字が出るように変更しました。具体的には接続しているIPアドレス+日付を元に計算
させて出た数値を、全カードの枚数で割った余りを元に、当日のカードを決定させてみました。
これで基本の計算式さえ一致させるだけで、ログを読み込むことなく日替わりでランダムなカードを
出現させることが可能となります。
また、抽選+振り分け+ログ記録と獲得画面表示プログラムを分離させました。
今までは一つのスクリプトで全部を受け持っていたのですが、それを独立させて、今回からは抽選
結果を元に、表示用プログラムへ連携させています。
振り分けプログラムを軽くするほど、システムが軽量化する見込みです。
また、カードのデータベースを一新させ、カードごとの個別ファイルに変えました。
今までは一覧表を読み込ませて乱数で選択…という流れでしたが、流石にカードの枚数も倍増
しており、不要なファイル読み込みも避けたかったので変更させました。
その代わり、メンテナンスが容易になるよう、一覧形式の元ファイルを機械的に読み込んで、表示
用のデータを生成させるロジックを組み込んだので、今後の更新も万全です。
但し更新のタイミングだけ少々重めの処理が走ります。
カードの表示部分だけは変更できたのですが、報告用掲示板の仕組みを変える時間が足りません
でした。(変更時に気づかなかったのも有るのですが…。)
他に負荷の温床をチェックしていて気づいたのが、トップページの当日獲得履歴です。
リンク元などをマウスオーバーで表示させる仕組みなので、ある程度大きいとは思っていたのですが
これも日替わり直前には7~8Mのサイズになっていました(汗)
単なるHTMLファイルで8Mって、考えるだけでも無茶なサイズです。
(これはログを最新100件のように毎回書き換えさせるより、単純に追記するほうが負荷が軽い
はずだと思っていたのもあるんですが…)
しかもタグの関係でSSI埋め込みで表示させているので、かなり負荷が掛かっているのは明らかです。
とりあえずログ形式も変更したので、仕方なく一時封印させました。
この辺りを軽くすれば、かなりの負荷軽減が見込めるはずです。
最終的にはもうちょっと人に見せられるようなソースになれば公開してしまうのですが、現状では
無駄が多すぎて見せられるようなソースでは有りません(汗)。
実際には配布して分散すれば、かなりの負荷軽減なのは事実なんですが、CGIの敷居は非常に
高いようなので、そう移行しないと思いますが。
実際には恥を覚悟で公開して、もっとソースをスリム化させたほうが良いとは判っているのですが…。