NonSoft

アクセスカウンタCGIのサンプル(perl)の改善。。。


 ち〜な〜み〜に〜

アクセスカウンタCGIのサンプル(perl)の改善。。。 2007/06/08
このサイトのアクセスカウンタ(のんカウンタCGI)の表示が遅い事について調査してみた。まず、ニフティーが提供しているアクセ スカウンタCGIと交換してみる。すると早い。良く見ると、ニフティーのアクセスカウンタCGIはテキストカウンタだった。のんカ ウンタは数字のGIFイメージを連結してカウンタ表示を行なっているので、それが遅いのかもしれないと思い、のんカウンタCGIに テキストカウンタの機能を追加してみる。と言ってもどうすれば良いのか分からない。。。とりあえず、ニフティーのアクセスカウンタ CGIのURLにIEから直接アクセスしてみる。するとIEの画面が真っ白になり、ソースに以下のようなJavaScriptが表 示された。
<!--
document.write("000991")
//-->
どうやら、カウンタ値をJavaScriptに埋め込んで送り返せば良いようなので、のんカウンタCGIにも実装してみる。カウン タの原理は一緒なので実装はすぐに完了した。その効果を試してみると、確かに表示処理は速くなった。しかしページ全体が表示される までが遅くなった。一瞬IEが真っ白になるこの現象はGIFイメージを使用していた時の遅さより気になる。。。GIFイメージの時 はページ全体の表示は速かった(アクセスカウンタの表示だけが遅かった)。調べてみると、JavaScriptをページの先頭や途 中で実行すると、そのJavaScriptが完了するまで次の文字等が表示されない仕様のようだ。ニフティーのアクセスカウンタC GIはとりあえずページの最後に配置してあったため今まで気付かなかった。では、JavaScriptをページの最後に実行しアク セスカウンタをページの途中に置く方法は無いだろうか?早速試してみた。方法はアクセスカウンタを表示したい場所に<span id="_NONcount"></span> を設定して置き、ページの最後でJavaScriptを実行する方法。CGIが返すJavaScriptは以下のようなもの。
<!--
var _span = document.getElementById("_NONcount");
_span.innerHTML = "000991";
//-->
この方法でページ全体の表示は今まで同様に速くなったが、アクセスカウンタはページの最後に表示されるため、GIFイメージの時と あまり変わらないようだった。ここまで調べて、結局、のんカウンタCGIの処理速度を早くするしか解決する方法が無いことに気付い た。では、のんカウンタCGIは何が遅いのか。のんカウンタCGIは複数のページのアクセス数を管理している。そのため各ページに IDを設定し毎回それをチェックしている。これが遅さの原因の一つと考えられるので、その処理を見直し、と言うより削除した。ん?、 少し早くなった? また、同時にアクセスされた時にカウンタの値がおかしくならないように排他制御を行なっているが、この処理も遅 さの原因と考えられるので削除した。変更前とくらべると随分早くなった気がする。これなら耐えられる。しかし、削除した2つの処理 の対策をしなければならない。各ページのIDチェックの代わりは、各ページのカウンタファイルがオープン出来るかどうかでチェック するようにした。カウンタファイルは変更前もオープンしていたため、処理を増やさずIDチェックの代わりが出来た。排他処理は同時 アクセス時、片方が書き込み、片方が読み込みの時に読込値がおかしくなり、おかしな値をカウントアップして書き込む事を防ぐための 処理のです。つまり、読み込んだカウンタ値がおかしい時(0以下の時をおかしいと判断)はカウンタ表示を88888888とし、カウンタフ ァイルへの書き込みは行なわないようにした。つまり、同時アクセス時はカウンタ表示を諦めると言う事。同時アクセスが多発するサイ トでもないので、とりあえずこれで様子を見る事にした。