PHP超入門 (39)


さて、前回は、今までこのメルマガでお話してきた事を基にして、簡単なアク
セスカウンターのプログラムを作ってみました。


----------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\count.txt","r+");

$count = fgets($file);

$count = $count + 1;

rewind($file);

fwrite($file,$count);

print("あなたは".$count."人目のお客様です。");
?>
----------------------------------------------------------


ただ、このプログラムには、今までお話してこなかった事が含まれていますし、
プログラム自体は問題なく動くのですが、このままだと大きな問題を生じてし
まう可能性があります。

それらを列挙すると、

 ・「fgets($file)」て何?

 ・「rewind($file)」て何?

 ・大きな問題とは何か?


となると思います。

そこで、今回は、これらのことについて、個々にお話していきたいと思います。



■「fgets($file)」て何?

ここでは、簡単に説明したいと思います。

これは「fgets(ファイルゲット)」関数を用いて、プログラムの一行目で作
成した変数「$file」から、「count.txt」に書かれている内容のみを純粋に取
り出しています。

なぜ、こんなメンドクサイことをするのかというと、変数「$file」には、「c
ount.txt」に書かれている内容に加えて、さらに、「count.txt」は「読み込
み」と「書き込み」の両方ができますヨということを指定している引数"r+"の
情報も入っているので、「count.txt」の内容のみを純粋に取り出すために、f
gets関数というものを使っています。



■「rewind($file)」て何?

ここでは、「rewind(リワインド)」関数というものを使っています。「rewi
nd」を英語の辞書で調べてみると、「巻き戻す」とかの意味がありますが、で
は、ここでは何を巻き戻しているのでしょうか?

これは言葉で説明するよりも、実例で確認した方が分かりやすいと思いますの
で、まず、それからやってみたいと思います。

では、この「rewind($file)」の部分を抜いたプログラムを作成します。
(エラーも起こさず問題なく動作します)


----------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\count.txt","r+");

$count = fgets($file);

$count = $count + 1;

fwrite($file,$count);

print("あなたは".$count."人目のお客様です。");
?>
----------------------------------------------------------

これを、「094-1.php」のファイル名で「C:\inetpub\wwwroot\php」フォルダ
に保存します。
(「0」とだけ書いたテキストファイル「count.txt」も同時に作ってそこに
 保存しておいてください)


そして、ブラウザのアドレス欄に「http://localhost/php/094-1.php」と何回
か入力してみてください。

そうすると、カウンターの値が「0,1,2,・・・」と増えていくのではなく、何
かデタラメな数字が表示されるのがわかると思います。


実際、「count.txt」の中身を見てみると、やはり、同じような数字が書き込
まれているので、


プログラムのエラーではなさそうです。

実は、この現象は、"r+"の上書き書き込みを開始する位置に原因があります。


以前ここで紹介した、"r+"を使ったプログラム例

 http://www.e-and-a.ws/06/090.asp

----------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\090-1.txt","r+");

fwrite($file,"あなたの実年齢は25歳です。")

?>
----------------------------------------------------------

では、正常に上書き書き込みが出来た訳ですが、これは、このプログラムの場
合、上書き書き込みを開始する位置が自動的に行頭にセットされます。

しかしながら、今回の例の場合は、上書き書き込みを開始する位置が自動的に
行末にセットされてしまうのです。

このために、同じ"r+"という同じ上書き書き込みでも、今回の場合は、追加書
き込みと同じような動作をしてしまう訳です。

----------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\090-1.txt","r+");

fwrite($file,"あなたの実年齢は25歳です。")

?>
----------------------------------------------------------

と同じように、通常の上書き書き込みをするためには、上書き書き込みをする
位置を行頭に持ってこなければなりません。

そこで、その働き(書き込む位置を行頭に巻き戻す)をするのが「rewind」関
数というわけです。

なんかメンドクサイですね。



■最後の大きな問題

さて、アクセスカウンターのプログラムの説明をしながら、一応の完成をみた
わけで、実際に動くことも確認しました。

そこで、自分のサーバーをインターネットに繋いで、世界に公開しようとする
訳ですが、ここで、一つ考えなければならない問題があります。

PHPプログラム自体は、サーバー専用のプログラムですから、一度に何人の人
がアクセスしようと何ら問題ない訳ですが、問題は、訪問者数を記録する「co
unt.txt」というファイルです。

この「count.txt」ファイル自体は、インターネットに公開することを考えて
いませんから、もし、同時に複数の人がPHPプログラムを通じてアクセスした
ら、どうなるのでしょう?

最悪の場合、ファイルが壊れてしまう可能性もあります。

できうれば、なんらかの方法で、複数の人がアクセスしても、一人づつ順番に
アクセスするような機構が必要になります。

そんな訳で、PHPのプログラムには、一人の人がアクセスしたら、その人がア
クセスし終わるまで、今回の場合、「count.txt」を保護(ロック)してくれ
る文法がチャント準備されています。

それが、「flock(ファイルロック)」関数です。


今回のアクセスカウンタプログラムの場合、

 ・ファイルをロック(保護)する・・・flock($file,LOCK_EX)

 ・ファイルのロック(保護)を外す・・・flock($file,LOCK_UN)

となります。

ここで注意するのは、「count.txt」を保護するといっても、「count.txt」そ
のものをflock関数の中に書くのではなく、プログラムの一行目に記述してあ
る、$file = fopen("C:\\inetpub\\wwwroot\\php\\count.txt","r+")で定義し
ている「$file」を書くことです。

また、ファイルをロック(保護)するタイミングと時間は、数字を「count.tx
t」にをPHPプログラムを通じて操作する時で、なるべく短時間の方が良いので、

-----------------------
 fwrite($file,$count);
-----------------------

の前後に、ファイルのロック(保護)と、それを外すのがベターでしょうから、

-----------------------
flock($file,LOCK_EX);

 fwrite($file,$count);

flock($file,LOCK_UN);
-----------------------

となるでしょう。


以上、あれこれお話してきましたが、アクセスカウンタの最終的なPHPプログ
ラムは、


----------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\count.txt","r+");

$count = fgets($file);

$count = $count + 1;

rewind($file);

flock($file,LOCK_EX);

fwrite($file,$count);

flock($file,LOCK_UN);

print("あなたは".$count."人目のお客様です。");
?>
----------------------------------------------------------

となり、これなら、このアクセスカウンタを使ったサーバーをインターネット
に接続しても十分実用可能なものとなります。


次回は、では、これをどうやって通常のホームページと一緒に使うか、簡単に
お話したいと思います。

新しく「パソコン(PC)初心者向け パソコンサポートサービス」を始めました。
詳細は専用サイトを御覧ください。

上記の内容はシリーズとしてメールマガジンで配信しています。

42歳のオヤジでもできた!パソコンサーバー化計画 (マガジンID:0000114576)

メールマガジン登録  メールアドレス:
メールマガジン解除  メールアドレス:

Powered by まぐまぐ

copyright(c) 2002-2007 E&A工房 All rights reserved.