Kár*_*rás 10 php sockets notifications node.js swift
我正在开发一个写在的IOS社交应用程序SWIFT.
后端是PHP, MySQL(用于事件处理),+一点NodeJS, Socket.io(用于实时聊天和通知)
我成功地聊了聊:
当用户发送消息时,Socket.io服务器通过以下方式处理它:
/为此,后端只是Socket.io服务器,它也处理数据库
工作良好.
但是有些事件并不是实时的,但我仍然希望通过Socket.io向给定用户发送通知.
例如:如果已经喜欢帖子,则将noti发送给帖子所有者
我已经编写了PHP文件,用于在数据库中保存,但是
我该怎么做通知部分,安全吗?
我想出了3个想法:
- 应用程序向我的PHP + MySQL后端发送Web请求,它处理那里的数据,然后在返回"成功"后,应用程序(SWIFT)向帖子所有者发送通知(通过Socket.io XCode pod)
func likePost(postId : Int, completion: @escaping (ActionResult?)->()){
let connectUrl = URL(string: appSettings.url + "/src/main/like.php")
var request = URLRequest(url: connectUrl!)
request.httpMethod = "POST"
let postString = "userId=\(userId)&session=\(session)&pId=\(postId)"
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) {
(data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
do {
let responseJson = try JSONSerialization.jsonObject(with: data!, options: [])
if let responseArray = responseJson as? [String: Any] {
let responseStatus = responseArray["status"] as? String
let responseTitle = responseArray["title"] as? String
let responseMessage = responseArray["message"] as? String
if responseStatus != "1" {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
// SUCCESS, SEND NOTI WITH SOCKET.IO
socket.emit("notification_likedPost", ["postId": postId)
return completion(ActionResult(type: 1, title: "success", message: "yay"))
}
} catch {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
}
task.resume()
}
Run Code Online (Sandbox Code Playgroud)
- 同样,但在从PHP返回"成功"后,本身(PHP文件)处理Socket.IO通知也会发出(我认为这是不可能的,我还没有找到任何PHP-> Socket.io插件. .)
-
- 该应用程序不向我的Web PHP + MySQL文件发送任何内容,而是将整个"喜欢"进程发送到我的NodeJs,Socket.IO服务器,它在那里处理它,将其保存到数据库,然后发出通知(就像实时聊天部分,但这将是很多工作因为我已经在PHP文件中编写了所有其他代码)
第一个案例对我来说是最理想的,但我害怕它会被黑客攻击..
因为如果我是第一种方式,后端NodeJs + Socket.io服务器将不会检查喜欢的过程是否成功(因为它被检查客户端)
所以很可能任何人都可以发送假的"类似邮件"通知,比如十亿次.
然后也许第二个选项也会很好,所以后端处理检查和通知发送,但遗憾的是没有用于PHP的Socket.io插件
会简单得多......
Express (您也可以将它与把手和i18n结合用于多语言目的)
使用 express,您可以为传入请求构建一个路由器 (
GET,PUT,POST,...)这意味着您可以使用它来渲染带有服务器端动态数据的页面
const express = require('express');
const exphbs = require('express-handlebars');
const app = express();
// Register Handlebars view engine
app.engine('handlebars', exphbs());
// Use Handlebars view engine
app.set('view engine', 'handlebars');
var visit_counter = 0;
app.get('/', (req, res) => {
var time_stamp = Date.now(); visit_counter++
res.render('index',{"timestamp":time_stamp,"visits":visit_counter});
});
app.listen(3000, () => {
console.log('Example app is running ? PORT 3000');
});
Run Code Online (Sandbox Code Playgroud)
该views/index.hbs文件将如下所示:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example App</title>
</head>
<body>
<p> Current Time : {{timestamp}} </p>
<p> Total Visits : {{visits}} </p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
以上部分是在最终 html 中呈现的服务器端数据的示例。
Socket.io(如果你想运行1个以上的服务器实例,没问题,查找socket.io-redis)
您可以通过不同方式将 express 与 socket.io 结合使用,您甚至可以为您的套接字协议使用基于 cookie 的身份验证。因此,当一个事件发生时,您实际上可以 100% 判断它是否是合法用户及其用户 ID。
为了防止喜欢的垃圾邮件......你必须以某种方式控制它们。你应该存储喜欢的动作,所以不能对同一个帖子重复多次(所以用户 ID 和帖子 ID 似乎是这里的重要变量)
因为你很清楚你想要一个php 和 nodejs 组合:
Redis是一种内存数据结构存储,可用作数据库、缓存和消息代理。
带有 PHP 和 Node.JS 的 Redis PubSub
Node.js 在 Redis 上读取 PHP 会话的快速示例
使用 Redis,您可以轻松地从您的 nodejs 实例中监听 php 事件。
我建议你也考虑一下你系统的未来扩展,并尝试学习更多的 nodejs 以便能够从 php 继续前进。
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |