2016-06-11 6 views
4

私はPhalcon PHPを使用しています。初めてsocket.ioを試してみたいと思います。私はsocket.ioでチュートリアルチャットメッセージを出しました。しかし、今、私は、クエリPhalconとテーブル「製品」の行数をカウントするために、私のデータベース内にいくつかのデータを選択したい:Socket.ioとPhalcon PHP

$count_products = Product::count(); 

例えば私のHTMLページに、私は5つの製品を持っていると私は追加しますとき1つの製品以上が私のテーブルに追加されました。製品HTMLページに6つの製品が表示されるように自動更新します。

どうすればよろしいですか?

+0

答えはありませんが、リアルタイム接続コンテンツの配信に特に適した[Node.js](https://nodejs.org/ja/)のようなソケット向けのツールを使用することを強くお勧めします。 Phalconは、あなたのケースでRESTful apisのための最良の選択です。 – yergo

+0

私はsocket.ioを使用すべきではないが、Node.jsを使用してソケットを作成し、Webサービスを作るためにPhalconサーバー側を使用する必要があります。私のすべてのWebサービスはNode jsソケットで消費されますか? – John

+0

socket.ioを使用すると、node.jsとともにサーバー側に使用できます。これは、dbに接続して、動的に処理する必要のあるデータを提供することができます。 [Here](http://stackoverflow.com/questions/34137572/python-how-to-run-commands-on-remote-hosts-and-show-output-in-gui-in-real-time/34138994# 34138994を参照してください)。 – yergo

答えて

4

ajaxリクエストでソケットを使用したら、そのままPhalconをそのまま使用して、node.js + socket.ioを使用して簡単なツールを実装してください。

最も簡単なアプローチは、ノードにイベント転送者を作成して片側のイベントをリッスンし、ユーザーのブラウザに転送することです。詳細はhereと記載されています。

documentationに記載されているように、ご使用のPhalconモデルにafterSaveリスナーを追加することをお勧めします。 afterSaveメソッドの実行中に、例えば、次のように渡すことができます。情報を持つノードサービスへのUDPパケット、Xテーブルに新しいレコードがあること。

Xテーブルが現在のユーザーによって表示されている場合、Nodeサービスはこのイベントをクライアントのブラウザに転送する必要があります。そうであれば、アクションを防ぐためにビューをロックし、Phalconサービスへのajaxリクエストを起動する必要があります.PalconサービスはDBに実際のデータを要求し、HTMLコンテンツを表示する必要があります。

もちろん、DB上の変更を直接聞くことができ、すべてのコンテンツが完全に動的に更新されるように適切なユーザーに適切なイベントを送信するノードサービスを作成できます。しかし、これは先進的なアプローチであり、少し過大な解決策になる可能性があります。 Phalconサービスがスピードに最適化され、送信されるデータがあまりにも大きくない限り、提案されたソリューションは秒単位で動作し、リアルタイムの感情を与えます。

ノードの代わりにPhalconを使用して転送サービスを作成することもできますが、実際にはイベントベースのツールを使用してこのようなイベントベースのスクリプトを維持するほうが簡単なので、後悔します。また、JavaScriptで時々動作する先進的なPHPプログラマにとっても、このような単純なソリューションを作るために、このような小さなNote.jsをすばやく学ぶことは難しいことではありません。

PHP

$host = array(
    'scheme' => 'udp', // udp makes it lightweight and connectionless 
    'host' => '192.168.10.10' // choose an IP where node is running 
    'port' => '8888' // choose one > 1023 
); 
$param = sprintf('%s://%s:%s', $host['scheme'], $host['host'], $host['port']); 
$socket = fsockopen($param, $errno, $errstr, $timeout); 

とソケットの上にパッケージを送信する私は、クラスSocketに囲まれたこのようなものを持っています。私はむしろ永続的なソケット(pfsockopen)を使用しているので、一度にいくつかのプロセスがそうでなければこのソケットを使用します。

fwrite($socket, json_encode($msg)); 

ノード:afterSaveで私は、多かれ少なかれんSend方法を、使用しています。あなたの依存関係がsocket.iodgramだろう

{ 
    "wsServer": { 
     "listeners": { 
      "udp": { 
       "port": 8888 
      } 
     }, 
     "server": { 
      "port": 8000 
     } 
    } 
} 

:JSイベントはExampleous設定ファイルnode.json

のWebSocket上でスクリプトを転送します。 Nodeアプリケーションを作成する方法を学ぶと、後で私が意味することを知ることができます。以下いただきまし理解しやすいようにするに

:だからあなたはノードのポート8888上で実行しているサーバーにJSONed文字列を送信し、ユーザーのウェブインターフェース

var config = require('node.json').wsServer; 
var app = require('http').createServer().listen(config.server.port); 
var io = require('socket.io').listen(app); 
var listenerDgram = require('dgram').createSocket('udp4'); 
listenerDgram.bind(config.listeners.udp.port); 

var users = {}; 

io.sockets.on('connection', function(socket) { 
    // if you make user to connect by his individual ID during 
    // websocket connection, providen after ?, like ?1234 
    var user = parseInt(socket.handshake.query.user); 

    // here to save user into var users 
    if (!users[user]) { 
     users[user] = { 
      sockets: [socket] 
     }; 
    } else { 
     users[user].sockets.push(socket); 
    } 

    socket.on('disconnect', function() { 
     // removing user from var users 
     // warning: socket by socket, and if last 
     // socket is closed, remove whole user section 
    }); 

}); 

// to emit data to all sockets of choosen users 
emit = function(sockets, message, data) { 
    for (var x in sockets) { 
     if (sockets[x]) { 
      sockets[x].emit(message, data); 
     } 
    } 
}; 

// now UDP listening section 
listenerDgram.on('message', function(msg, rinfo) { 

    // you can declare checkIncoming if you have standarized 
    // frames, or just use msg as it is 
    var _dat = checkIncoming(msg.toString().trim(), true); 
    var _response = { 
     action: _dat.action, 
     data: _dat.data 
    }; 

    // you can declare standarizeFrame to define your own protocol, 
    // or just use _response. 
    var frame = standarizeFrame(_response); 

    if (_dat.user) { // emitting to single user declared 
     emit(users[_dat.user].sockets, 'notification', frame); 
    } else { // emitting to all connected users 
     io.emit('notification', frame); 
    } 
}); 

が戻ってそれらを受け取るために、ポート8000​​上の同じホストに接続します。あなたに先んじて多くのデバッグ。

PS:このような任意の答えは申し訳ありませんが、私はPhalconと恋をしていて、Node.jsが存在するかどうか知りませんでした。 Nodeを学ぶ時間を与えてくれたので、イベントベースのソリューションを最小限に抑え、数千ではなく100行で囲み、メンテナンスを容易にし、PHPベースのクライアントよりもCPUと満足したクライアントに深い息を吹き込みました。

+0

本当にありがとうございます。そこで、afterSaveでメソッドを実装しようとします。これは最善の方法と思われ、SQLクエリーの無限ループより優れています:)。 – John

+0

しかし、afterSaveからノードjsにメッセージを送信する方法を教えてください。 – John

+0

ここにはさらに多くの情報があります。うまくいけば、それは今のところ難しいだろう。 – yergo