phpな休日 BBS sitemap
5197
カウンタを作る

簡単なカウンタを作ります。

●準備

スクリーンショット画像

テキストエディタで 0 とだけ書いたファイルを作成します。
(改行は入れません。今回ファイル名は count.txt にしました。)
インターネットのサーバーにアップしたらパーミッションを(読み書き属性)に設定します。
パーミッションの数値に関してはお使いのサーバーの仕様によって異なりますので、サーバーのマニュアルをご覧ください。
ここ(Doレジドメインパック)では 600 で、ロリポップサーバーでは 606 でOKです。
(XAMPPなどWindows上のローカル環境ではパーミッションの設定は不要です。)

●カウント処理

<?php
$pcounter = fopen ("./count.txt","r+");
$count = fgets ($pcounter);
$count++;
rewind ($pcounter);
fputs ($pcounter,$count);
fclose ($pcounter);
?>

fopen でデータファイルを開きますが、読み書きモードの引数 r+ で開きます。
fgets で読み込んだカウント値に $count++ で1足します。
+++1 と同意になります。
rewind でファイルポインタを先頭に戻しています。r+ で読み込んだ時はデータは空にならないので rewind しないで書き込みすると、例えば 1 だったカウンタにアクセスすると 12 になってしまいます。
fputs で新しいカウント値を書き込みます。

●表示部分

表示部分はたった一行

print $count;

です。表示結果はこのページの右上にあります。文字サイズや色の変更はHTMLの font タグ、あるいはスタイルシートで設定します。

ファイルロック

カウンタに限らずファイルを読み書きする場合、同時アクセスによるデータの不整合・破損の問題があります。
そこでファイルを開いた直後にファイルをロックする、書き込んだらロックを解除するという作業を行います。上記スクリプトに付け加えると、

<?php
$pcounter = fopen ("./count.txt","r+");
flock ($pcounter, LOCK_EX);//ファイルロック
$count = fgets ($pcounter);
$count++;
rewind ($pcounter);
fputs ($pcounter,$count);
flock ($pcounter, LOCK_UN);//ロック解除
fclose ($pcounter);
?>

この処理により、ファイルロック中に別のアクセスがあった場合、ファイルのオープンを待たせることが出来ますが、可能性として 「ファイルを開いた後ロックするまでのわずかな瞬間」 に別のアクセスが発生することはじゅうぶん考えられます。

●コメントについて

上記ソースの [ファイルロック] の行の //ファイルロック ですが、PHPスクリプト中では // 以降行末までは [コメント] となり実行されない部分となります。スクリプト中に適時 [コメント] を挿入していくと見やすくなります。


うまくスクリプトが書けない方、すぐには環境(エディタなど)が整わない方、とにかく設置して動作を見たい方のために こちら からzip形式をダウンロードできるようにしました。

2014.2.4 last edit

Produced by haku