3.3 実用的なカウンター

この項では実用性のあるカウンターを考えます。
設計方針は以下の2点です。

  1. ケタ制限をなくす
    前項のカウンターでは4ケタカウンターを表示する方法を学びました。
    ここでは、ケタ制限をなくしたカウンターを考えます。
  2. ファイルへの同時書込問題の解決
    ファイルからの読み出しでは、問題にならないのですが、ファイルへの書込みが発生する場合、注意すべき重要な事柄があります。
    ファイルへの同時書込みの問題です。

<ファイルへの同時書込み>
HPは不特定多数の人が、不定期にアクセスします。
したがって、全く同時に、同じHPにアクセスされることも想定しなければなりません。
もし、同時に複数の人から、HPをアクセスされたら、どのような問題が発生するのでしょうか?

鈴木さんと、田中さんが同時に、同じHPへアクセスした場合を考えてみましょう。
カウンター値は、ファイルに格納してありましたね。
今、鈴木さんが、HPを開いたとします。
その時CGIは、カウンター値をファイルから読み出し1upして、カウンター値をファイルへ書き込もうとします。
カウンター値を書き込む前にファイルを書込みモードでオープンしますね。
具体的には、次の命令を実行します。
    open(OUT,">esy_cnt.dat");

この時に、田中さんが同じHPをアクセスしたとします。
CGIはカウンター値をファイルから読み出そうとしますが、開いたカウンター値のファイルには、中身がありません。
(鈴木さんが起動させたCGIが、まだカウンター値を書き込んでいない)
ファイルの中身がないので、田中さんが読み出したカウンター値は0になります。
田中さんが起動したCGIは、カウンター値を1upして、ファイルに書き込もうとするので、カウンター値=1を書き込みます。
つまり、この時点でカウンター値は、破壊されます。
このような問題を防ぐために、ファイルへの書き込み時は、他の人からのファイル・アクセスを禁止する必要があります。

以上、2点を考慮したカウンターを作成してあるので、下の実用的なカウンターをクリックしてみてください。

実用的なカウンター


戻る 次へ