标签:php mysql socket-io phalcon
我正在使用Phalcon PHP,我想第一次尝试socket.io.我用socket.io做了教程聊天消息.但现在我想在我的数据库中选择一些数据,用查询Phalcon计算表’product’中的行数:
$count_products = Product::count();
例如,在我的HTML页面中,我有5个产品,当我将一个或多个产品添加到我的表产品中时,我想要自动刷新以查看我的HTML页面中的6个产品.
你能帮帮我吗?
解决方法:
一旦您使用套接字而不是ajax请求,您应该保持Phalcon不变,并尝试使用node.js socket.io实现简单工具.
最简单的方法是在Node中创建一个事件转发器,它将在一侧监听事件,并将它们转发给用户浏览器.更多描述here.
在你的情况下,我建议在你的Phalcon模型中添加一个afterSave监听器,如documentation所述.在afterSave方法中,你将能够通过例如.带有信息的UDP数据包到您的节点服务,X表中有新记录.
比你的Node服务应该将此事件转发到客户端的浏览器,javascript应该决定,当前用户是否正在查看X表.如果是,它应该锁定视图以防止任何操作并向Phalcon服务发出ajax请求,这应该向您的数据库询问实际数据并刷新视图中的HTML内容.
当然,您可以创建一个Node服务,直接在DB上侦听更改,并将正确的事件发送给正确的用户,所有内容都准备好完全动态更新.但这是一种先进的方法,可能有点过度的解决方案.我想强调一下,只要您的Phalcon服务针对速度进行了优化并且发送的数据不是太大,所提出的解决方案可以在几分之一秒内完成,给出实时感觉.
当然,您可以使用Phalcon而不是Node来创建转发服务,但是一段时间后您会后悔,因为使用实际上基于事件的工具来维护这样的基于事件的脚本更容易.对于那些不时使用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),所以很少有进程一次使用这个套接字,即使它看起来不是这样.在afterSave中我使用的是Send方法,它或多或少地做了:
fwrite($socket, json_encode($msg));
Nodeocket上的Node.js事件转发脚本
示例配置文件node.json:
{
"wsServer": {
"listeners": {
"udp": {
"port": 8888
}
},
"server": {
"port": 8000
}
}
}
您的依赖项将是socket.io和dgram.一旦您学会了如何创建Node应用程序,您将在后面了解我的意思.
为了便于理解以下内容:
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字符串发送到端口8888上运行Node的服务器,并且用户Web界面连接到端口8000上的同一主机以接收它们.你前面有很多调试.
PS:对不起这么随意的答案,但我自己走了过去,因为我爱上了Phalcon并且对Node.js甚至不存在知之甚少.让自己有时间学习Node帮助我将基于事件的解决方案减少到绝对最低限度,将它们包含在100行而不是数千行中,使它们易于维护,让我的服务器深入了解CPU,让客户满意甚至比基于php的客户更满意.
标签:php,mysql,socket-io,phalcon 来源: https://codeday.me/bug/20190608/1200055.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。