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.io
とdgram
だろう
{
"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と満足したクライアントに深い息を吹き込みました。
答えはありませんが、リアルタイム接続コンテンツの配信に特に適した[Node.js](https://nodejs.org/ja/)のようなソケット向けのツールを使用することを強くお勧めします。 Phalconは、あなたのケースでRESTful apisのための最良の選択です。 – yergo
私はsocket.ioを使用すべきではないが、Node.jsを使用してソケットを作成し、Webサービスを作るためにPhalconサーバー側を使用する必要があります。私のすべてのWebサービスはNode jsソケットで消費されますか? – John
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