この項では実用性のあるカウンターを考えます。
設計方針は以下の2点です。
<ファイルへの同時書込み>
HPは不特定多数の人が、不定期にアクセスします。
したがって、全く同時に、同じHPにアクセスされることも想定しなければなりません。
もし、同時に複数の人から、HPをアクセスされたら、どのような問題が発生するのでしょうか?
鈴木さんと、田中さんが同時に、同じHPへアクセスした場合を考えてみましょう。
カウンター値は、ファイルに格納してありましたね。
今、鈴木さんが、HPを開いたとします。
その時CGIは、カウンター値をファイルから読み出し1upして、カウンター値をファイルへ書き込もうとします。
カウンター値を書き込む前にファイルを書込みモードでオープンしますね。
具体的には、次の命令を実行します。
open(OUT,">esy_cnt.dat");
この時に、田中さんが同じHPをアクセスしたとします。
CGIはカウンター値をファイルから読み出そうとしますが、開いたカウンター値のファイルには、中身がありません。
(鈴木さんが起動させたCGIが、まだカウンター値を書き込んでいない)
ファイルの中身がないので、田中さんが読み出したカウンター値は0になります。
田中さんが起動したCGIは、カウンター値を1upして、ファイルに書き込もうとするので、カウンター値=1を書き込みます。
つまり、この時点でカウンター値は、破壊されます。
このような問題を防ぐために、ファイルへの書き込み時は、他の人からのファイル・アクセスを禁止する必要があります。
以上、2点を考慮したカウンターを作成してあるので、下の実用的なカウンターをクリックしてみてください。