Polling

Polling.php を呼び出すコードです。
<a href="http://maedakobe.rw.xsi.jp/php/polling.php?id=AA" target="_blank">Polling のテスト</a><br>
次のリンクをクリックすると Polling.php を呼び出します。
5秒間隔で呼び出すので、しばらく待って下さい。
Polling のテスト id=AA
Polling のテスト id=BB

サーバーに対して自動的(定期的)に PHP を呼び出すように設定します。
呼び出された PHP では、このタイミングでサーバー上のファイルなどにアクセスして最新の情報に更新します。
ポーリングとは、通信やソフトウェアにおいて、競合を回避したり、送受信の準備状況を判断したり、処理を同期したりするために、複数の機器やプログラムに対して順番に定期的に問い合わせを行い、一定の条件を満たした場合に送受信や処理を行う通信及び処理方式のことです。

バージョンアップ

  1. 2017/05/01 久しぶりにサーバーの PHP のバージョンを確認すると 5.6.30 にアップされていました。
    そこでサーバーのバージョンに合わせてネットワークゲームを再編成します。
    本来 PHP のページはサーバー上で動作するので、クライアント側では PHP をインストールする必要はありません。
    しかしながら、サーバー上でデバッグを繰り返すのでは余りにも効率が悪いのと、コンソールモードで動かすときは PHP のインストールが必要です。
  2. 2017/05/04 Windows10 でサーバーのバージョンに合わせて 5.6.30 をインストールします。
    PHP Download または PHP Downloads から Windows downloads/PHP 5.6(5.6.30)→VC11 x64 Thread Safe(2017-Jan-19 07:07:56)→Zip[22.06MB] をダウンロードします。
    php-5.6.30-Win32-VC11-x64.zip を解凍して C:\BIN\PHP\ に移動して準備完了です。
  3. PHP が動くことを確認します。
    1. コマンドプロンプトを起動します。
      コマンドプロンプトのタイプは大文字でも小文字でも構いません。
    2. C:\BIN\php\ に移動します。
      C:\Users\maeda>cd c:\bin\php
      
    3. バージョン情報を表示します。
      c:\BIN\PHP>php.exe -v
      
    4. バージョン情報が表示されたらOKです。
      Microsoft Windows [Version 10.0.14393]
      (c) 2016 Microsoft Corporation. All rights reserved.
      
      C:\Users\maeda>cd c:\bin\php
      
      c:\BIN\PHP>php.exe -v
      PHP 5.6.30 (cli) (built: Jan 18 2017 19:47:36)
      Copyright (c) 1997-2016 The PHP Group
      Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
      
    5. 続いてパラメータ一覧を表示します。
      php.exe の .exe は省略することが出来ます。
      c:\BIN\PHP>php -?
      
    6. PHP のパスを設定すれば任意のディレクトリで作業をすることが出来るのですが、今回はパスを設定せずに作業することにします。
      パスの設定は Hello PHP を参照して下さい。
  4. PHP のページはサーバー上で動作するので、サーバーのバージョンを確認するプログラムをアップロードします。
    拡張子を .php でサーバーにアップロードして実行して下さい。
    <?php phpinfo(); ?>
    
    サーバーの PHP info を表示する phpinfo.php を呼び出します

自動的に呼び出す

  1. ネット対戦ゲームでは、ゲームそのものよりもサーバーを介して情報をやり取りする処理が面倒です。
    複数のクライアントが同時にログインしてお互いに情報を交換するとなると一筋縄では行きません。
    クライアント間で参照するデータは、当然ながらサーバー上に置いて不規則に更新されます。
    更新された情報をクライアントが取得するには、サーバーに対して送信要求を出します。
    今回は5秒間隔で自動的に polling.php の呼び出しを繰り返すプログラムです。
    例えば「じゃんけんゲーム」では先にログインしたプレイヤーAは、対戦相手が現れるまで待ち合わせなければなりません。
    最初に思い浮かぶのは、プレイヤーの操作(クリックなど)で時々サーバーに対して問い合わせる方法でしょうか。
    Polling を使えば、対戦相手が来たことや相手がじゃんけんをしたことなどを待っていれば教えてくれます。
  2. polling.php を Shift_JIS でタイプしてアップロードして下さい。
    サーバー上では utf-8 も使えるようですが、コマンドプロンプトでコンパイルすると全角が文字化けします。
    <html>
    <head><meta http-equiv="content-type" content="text/html; charset=Shift_JIS"></head>
    
    <body bgcolor=#fafeff>
    <h1>自動で再起的に呼び出す</h1>
    <?php
        $id= $_GET['id'];           //ID
        if (!isset($id))
        {   $id= 'none';  }
    ?>
    <script type="text/javascript">
    function update()
    {   var id = "<?php echo $id;?>";
        str= "polling.php?id=" + id;
        if (confirm(str + "  呼び出しますか?")==true)
            location.href = str;
    }
    
    setTimeout('update()',5000);
    </script>
    </body>
    </html>
    
  3. アップロードする前に polling.php を c:\tmp\ に置いてコマンドプロンプトでエラーチェックします。
    Microsoft Windows [Version 10.0.14393]
    (c) 2016 Microsoft Corporation. All rights reserved.
    
    C:\Users\maeda>cd \bin\php
    
    C:\BIN\PHP>php c:\tmp\polling.php
    <html>
    <body bgcolor=#fafeff>
    <h1>自動で再起的に呼び出す</h1>
    <script type="text/javascript">
    function update()
    {   var id = "none";
        str= "polling.php?id=" + id;
        if (confirm(str + "  呼び出しますか?")==true)
            location.href = str;
    }
    
    setTimeout('update()',5000);
    </script>
    </body>
    </html>
    
    C:\BIN\PHP>
    

polling.php の説明

  1. 自動的に呼び出しを設定するときは Javascript を使います。
    polling.php が呼び出されると 5000ミリ秒後に update() 関数を呼び出します。
    指定時間後に一度だけ呼び出したい場合には setTimeout() を使います。
    一定の遅延間隔を置いて関数を繰り返し呼び出すときは setInterval() を使います。
    今回は setTimeout() で一度だけ呼び出しますが、呼び出された update() 関数から再び polling.php が呼び出されます。
    polling.php が呼び出されると、update() 関数から再び polling.php を呼び出すので繰り返し呼び出されることになります。
    setTimeout('update()',5000);
    </script>
    
  2. update() 関数から polling.php(自分自身)を呼び出します。
    呼び出したプレイヤーを識別するために PHP の変数 $id をパラメータで渡します。
    PHP 変数の参照は 変数の参照 を参照して下さい。
    confirm() は確認ダイアログを表示するスクリプトで、yes のときに location.href = str; で polling.php を呼び出します。
    今回の場合は5秒間隔で polling.php が呼び出されます。
    実際のゲームでは、呼び出されたタイミングでサーバー上のデータ(データベースなど)を取得して最新の情報に更新します。
    <script type="text/javascript">
    function update()
    {   var id = "<?php echo $id;?>";
        str= "polling.php?id=" + id;
        if (confirm(str + "  呼び出しますか?")==true)
            location.href = str;
    }
    
  3. PHP ではパラメータ $id を受け取ります。
    プレイヤーを識別する必要が無いときは $id='none' に設定しています。
    <?php
        $id= $_GET['id'];           //ID
        if (!isset($id))
        {   $id= 'none';  }
    ?>
    

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