何时处理Socket.io通知?

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个想法:

  1. 应用程序向我的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)
  1. 同样,但在从PHP返回"成功"后,本身(PHP文件)处理Socket.IO通知也会发出(我认为这是不可能的,我还没有找到任何PHP-> Socket.io插件. .)

-

  1. 该应用程序不向我的Web PHP + MySQL文件发送任何内容,而是将整个"喜欢"进程发送到我的NodeJs,Socket.IO服务器,它在那里处理它,将其保存到数据库,然后发出通知(就像实时聊天部分,但这将是很多工作因为我已经在PHP文件中编写了所有其他代码)

第一个案例对我来说是最理想的,但我害怕它会被黑客攻击..

因为如果我是第一种方式,后端NodeJs + Socket.io服务器将不会检查喜欢的过程是否成功(因为它被检查客户端)

所以很可能任何人都可以发送假的"类似邮件"通知,比如十亿次.


然后也许第二个选项也会很好,所以后端处理检查和通知发送,但遗憾的是没有用于PHP的Socket.io插件

EMX*_*EMX 7

会简单得多......

忘记 PHP,使用完整的 Nodejs:

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是一种内存数据结构存储,可用作数据库、缓存和消息代理。

PHPRedis @Github

带有 PHP 和 Node.JS 的 Redis PubSub

Node.js 在 Redis 上读取 PHP 会话的快速示例

使用 Redis,您可以轻松地从您的 nodejs 实例中监听 php 事件。

我建议你也考虑一下你系统的未来扩展,并尝试学习更多的 nodejs 以便能够从 php 继续前进。