Polling Test

polling_test.php を呼び出すコードです。
サーバー上、またはビルトインサーバーから実行して下さい。
<a href="polling_test.php?id=AA" target="_blank">Polling のテスト id=AA</a><br>

次のリンクをクリックすると polling_test.php が呼び出されます。
test.txt を初期化してから始めて下さい。
最初に id=AA をクリックして起動します。
同時に別のネット環境からホームページを立ち上げて id=BB をクリックします。
(1台のパソコンで別のホームページを立ち上げてテストすることも出来ます)
CNT が9を超えたら終了です。
test.txt の初期化
Polling のテスト id=AA
Polling のテスト id=BB

polling_test.php の概要

  1. Polling でサーバー上のファイルから最新の情報を取得します。
    ポーリングとは、通信やソフトウェアにおいて、競合を回避したり、送受信の準備状況を判断したり、処理を同期したりするために、複数の機器やプログラムに対して順番に定期的に問い合わせを行い、一定の条件を満たした場合に送受信や処理を行う通信及び処理方式のことです。
    例えば「じゃんけんゲーム」で Polling を使えば、対戦相手が来たことや相手がじゃんけんをしたことを自動的に知ることが出来ます。
  2. サーバー上に格納した TEXT 形式のファイル(test.txt)を二人のプレイヤーが同時に更新しながらゲームを進めます。
    test.txt をサーバーにアップロードして下さい。
    ファイルの内容は最初に初期化するので何が書かれていても構わないので、書き込みと読み込み属性を許可して下さい。
    名前 説明
    $tim 更新された Time Stamp
    $id プレイヤーのID
    $cnt プレイヤーのアクセスカウント
  3. polling_test.php で定義されている関数です。
    ソースコードはこの後を参照して下さい。

polling_test.php の説明

  1. Class を組み込まないで直接 head 内で関数を定義します。
    polling_test.php を utf-8 でタイプしてアップロードして下さい。
    <html>
    <head><title>Polling Test</title>
    <?php
    // cnt を Count Up
    function  action($id)
    {   global $cnt;
        $cnt++;
    }
    // test.txt に書き込む
    function  put()
    {   global $tim, $id, $cnt;
        if (!($fp = fopen("test.txt","w")))
        {   die("Text File Not Found");  }
        flock($fp,LOCK_EX);
        fputs($fp,"$tim\r\n");
        fputs($fp,"$id\r\n"); 
        fputs($fp,"$cnt\r\n"); 
        flock($fp,LOCK_UN);
        fclose($fp);
    }
    // test.txt から cnt を取得
    function  get()
    {   global $cnt;
        if (!($fp = fopen("test.txt","r")))
        {   die("Text File Open Error");  }
        $w= intval(fgets($fp));     //tim を読み飛ばす
        $w= fgets($fp);             //id を読み飛ばす
        $cnt= intval(fgets($fp));
        fclose($fp);
    }
    // $tim, $id, $cnt; を印字
    function check()
    {   global $tim, $id, $cnt;
        print "<table border='1'>";
        print "<tr><th>TIME</th><th>ID</th><th>CNT</th></tr><tr>";
        print("<td>$tim</td>");
        print("<td>$id</td>");
        print("<td>$cnt</td>");
        print("</tr></table>\n");
    }
    ?>
    </head>
    
    <body bgcolor=#fafeff>
    <h1>Polling Test</h1>
    <?php
        $tim= time();
        $id= '--';
        $cnt= 0;
    
        $id= $_GET['id'];   //ID のパラメータを設定
        if (!isset($id))    //ID が無いとき規定値に設定
        {   $id= '--';
        }
        else
        {   get();          //cnt を取得
            action($id);    //Count Up
        }
        put();              //現在の設定値を書き出す
        check();
    error_log("$tim, $id, $cnt\n", 3, 'app.log');
    ?>
    <script type="text/javascript">
    function update()
    {   var id= "<?php echo $id;?>";
        var cnt= "<?php echo $cnt;?>";
        str= "polling_test.php?id=" + id;
        if (id!='--' && cnt<10)      location.href = str;
    }
    setTimeout('update()',3000);
    </script>
    </body>
    </html>
    
  2. polling_test.php の関数は <head> の中で定義されています。
    PHP のグローバル領域を関数の中で参照するときは global で宣言して下さい。
  3. プログラムは <?php の次の行から実行されます。
    ID のパラメータが設定されていないときは '--' として、そのまま put() 関数が実行されます。
    すなわち $id='--', $cnt=0 で初期化することになります。
    ID が設定されているときは、現在の $cnt を取得してカウントアップして更新します。
    error_log() 関数で $cnt がカウントアップされる様子を app.log に記録しています。
        $tim= time();
        $id= '--';
        $cnt= 0;
    
        $id= $_GET['id'];   //ID のパラメータを設定
        if (!isset($id))    //ID が無いとき規定値に設定
        {   $id= '--';
        }
        else
        {   get();          //cnt を取得
            action($id);    //Count Up
        }
        put();              //現在の設定値を書き出す
        check();
    error_log("$tim, $id, $cnt\n", 3, 'app.log');
    ?>
    
  4. polling_test.php が3秒後に再起コールされます。
    呼び出す条件は $id が '--' で無くて $cnt が 10 より小さいときです。
    <script type="text/javascript">
    function update()
    {   var id= "<?php echo $id;?>";
        var cnt= "<?php echo $cnt;?>";
        str= "polling_test.php?id=" + id;
        if (id!='--' && cnt<10)     location.href = str;
    }
    setTimeout('update()',3000);
    </script>
    
  5. このプログラムを実行したときの app.log の記録です。
    app.log はサーバー上の polling_test.php と同じフォルダーに格納されているのでダウンロードして下さい。
    AA と BB が不規則に $cnt をカウントしています。
    カウントが 11 になっているのは、二人のプレイヤーが参加しているからです。
    1494074772, --, 0
    1494074786, AA, 1
    1494074790, BB, 2
    1494074790, AA, 3
    1494074791, BB, 4
    1494074791, BB, 5
    1494074793, BB, 6
    1494074794, AA, 7
    1494074796, BB, 8
    1494074798, AA, 9
    1494074799, BB, 10
    1494074802, AA, 11
    

【ソースコード】
今までは PHP のソースは Shift_JIS でタイプしてアップロードしていました。
理由はコマンドプロンプトでテストすると全角文字が文字化けするからです。
ところがビルトインサーバーを使うと Shift_JIS の方が文字化けします。
そこで HTML も PHP のソースコードも utf-8 でタイプすることにします。

前田稔の超初心者のプログラム入門
PHP Program