아약스 요청으로 소켓을 사용하고 나면 팔콘을 그대로두고 node.js + socket.io을 사용하여 간단한 도구를 구현해야합니다.
가장 간단한 접근법은 노드에서 이벤트 전달자를 작성하여 한 쪽 이벤트를 수신하고 사용자 브라우저로 전달하는 것입니다. 자세한 내용은 here입니다.
귀하의 경우에는 documentation에 설명 된대로 afterSave
청취자를 Phalcon 모델에 추가하는 것이 좋습니다. afterSave
방법 중에 예를 들어 통과 할 수 있습니다. X
테이블에 새로운 레코드가 있다는 정보가있는 노드 서비스에 대한 UDP 패킷.
현재 사용자가 X
테이블을보고있는 경우 노드 서비스가이 이벤트를 자바 스크립트가 결정해야하는 클라이언트의 브라우저로 전달해야합니다. 그렇다면, 어떤 행동도하지 못하도록보기를 잠그고 Phalcon 서비스에 대한 ajax 요청을 실행해야합니다. 그러면 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
방법을 사용하고 있습니다.웹 소켓
Exampleous 구성 파일 node.json
을 통해 스크립트를 전달 JS 이벤트 :
{
"wsServer": {
"listeners": {
"udp": {
"port": 8888
}
},
"server": {
"port": 8000
}
}
}
의존성은 socket.io
및 dgram
될 것이다. 노드 응용 프로그램을 만드는 방법을 배우게되면 나중에 무슨 뜻인지 알게 될 것입니다. 노드가 포트 8888에서 실행되는 경우
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);
}
});
그래서 당신은 서버에 JSONed 문자열을 전송하고, 사용자의 웹 인터페이스는 그들을 다시받을 포트 8000에 같은 호스트에 연결 :
다음 뭐죠 이해하기 쉽게합니다. 많은 디버깅이 앞서 있습니다.
추신 : 그런 임의적 인 대답은 유감이지만 필자는 Phalcon과 사랑에 빠졌고 Node.js가 존재하는지에 대해 전혀 알지 못해서 혼자 걸어갔습니다. Node에 대해 배울 수있는 시간을 주면서 이벤트 기반 솔루션을 최소한으로 줄일 수있었습니다. 수천 대신 100 줄로 유지하고 관리하기 쉬워서 PHP 기반 클라이언트보다 CPU 및 만족 클라이언트에 심대한 호흡을 심어주었습니다. .
답변을 드릴 수 없지만 [Node.js] (https://nodejs.org/en/)와 같이 소켓 용으로 설계된 도구를 사용하는 것이 좋습니다. 이는 특히 실시간 연결 콘텐츠를 제공하는 데 적합합니다. 팔콘은 귀하의 경우에 RESTful apis를위한 최선의 선택입니다. – yergo
당신은 socket.io를 사용해서는 안되지만 Node.js를 사용하여 내 소켓을 만들고 Phalcon 서버 측에서 웹 서비스를 만들어야한다는 것을 의미합니까? 그리고 모든 웹 서비스는 Node js 소켓에 의해 소비 될 것인가? – John
아니요. socket.io를 사용하면 node.js와 함께 서버 측으로 사용할 수 있습니다.이 서버는 db에 연결하여 동적으로 제공해야하는 데이터를 제공 할 수 있습니다. [여기] (http://stackoverflow.com/questions/34137572/python-how-to-run-commands-on-remote-hosts-and-show-output-in-gui-in-real-time/34138994# 34138994) exampleal approach에서 더 많은 설명을 찾을 수 있습니다. – yergo