Php 如何将通知推送到在线web应用程序用户?

Php 如何将通知推送到在线web应用程序用户?,php,jquery,html,ajax,chat,Php,Jquery,Html,Ajax,Chat,我正在进行一个大学项目,在那里我必须进行一次聊天,聊天中包含邀请选项,只有注册用户之间才能接受/拒绝邀请。如果接受邀请,则打开聊天室,否则向发件人发送消息 除了这个邀请选项,我已经完成了整个项目。我知道我可以使用COOKIE(使用setInterval),但我需要更安全的方法来实现这一点 在我当前的PHPinvite函数中,(例如:邀请发件人:a@a.com,邀请:b@b.com)我曾经验证过b@b.comuser(已注册或未注册),并通过验证发回JSON。如果用户已注册,则仅在自助端打开聊天室

我正在进行一个大学项目,在那里我必须进行一次聊天,聊天中包含邀请选项,只有注册用户之间才能接受/拒绝邀请。如果接受邀请,则打开聊天室,否则向发件人发送消息

除了这个邀请选项,我已经完成了整个项目。我知道我可以使用
COOKIE
(使用
setInterval
),但我需要更安全的方法来实现这一点

在我当前的PHP
invite
函数中,(例如:
邀请发件人:a@a.com,邀请:b@b.com
)我曾经验证过
b@b.com
user(已注册或未注册),并通过验证发回JSON。如果用户已注册,则仅在自助端打开聊天室(
a@a.com
)并可以向
b@b.com
b@b.com
用户只有在打开带有邀请的聊天框时才会收到这些消息
发件人:b@b.com,适用于:a@a.com

我不知道如何将邀请直接发送到
b@b.com
带有选项,并将单击的事件(
接受/拒绝
)返回到`a@a.com.

目前,我脑子里只有一个想法:
cookie
with
setInterval
。但这种想法有一个缺点,即两个用户页面都在不断地检查cookie,这意味着在带宽上有更多的负载,在用户端有更多的进程,最重要的是,这是不安全的。 我已经在我的项目中加入了用户3
setInterval
功能:
状态检查、新的msgs检查和聊天选项


那么,有谁能提出更好的方法吗?

这是一个相当广泛的问题,但我将尝试提供一些基本的设计指导。我希望用户输入他们的电子邮件地址和其他人的电子邮件地址,然后单击“登录”按钮

接下来会发生什么取决于您的设计,但这就是我要做的。这涉及到AJAX操作,这一点很好

  • 详细信息将提交到服务器,并在用户表中创建一行。默认情况下,用户会获得一个普通的会话cookie,因此您只需在每个页面的开头添加
    session\u start
    。还将创建对话表中的一行
  • 我们假设用户现在处于已连接但未聊天的状态
  • 使用jQuery或类似工具,会定期调用服务器,以查看服务器端的应用程序状态是否需要更新。首先,这将确定其他用户是否可用。假设此调用每10秒进行一次,以避免负载过大,并且每次调用时,用户表都会在时间戳处更新一个
    上次看到的时间戳
  • 您在服务器上运行一个脚本,该脚本检查实时对话行,并查看双方是否在线。如果是,并且会话未标记为已启动,则更新行,然后在用户下次请求更新时通知用户
  • 当浏览器应用程序收到某种通知(在对定期AJAX请求的回复中)时,它需要重新绘制屏幕。生命周期是:开始->登录->等待->聊天->注销。要做到这一点,您需要使用JavaScript
  • 下面我建议的表结构中的一些字段用于捕获聊天状态,因此您的PHP应用程序不必自己记住事情。例如,如果
    conversation.accepted\u by\u user\u id
    为空,则对话正在等待第二个用户接受聊天请求。如果填充了位于
    message.received\u,但位于
    message.sent\u为空,则表示下次发送更新请求时需要将消息发送给第二个用户
  • 当用户或对话变得太旧时,可以将其标记为过时或完全删除
  • 旁注:我们没有试图检查用户是否拥有他们指定的电子邮件地址,或者他们是否存在。但是,在大多数情况下,这并不重要——我们所需要的只是双方都能记住一个独特的字符串

    建议的表格:

    user (
        id (pk) int,
        email varchar, // user's email address
        email_to varchar, // the email address of who they wish to chat to
        session_id varchar,
        last_seen_at timestamp
    )
    conversation (
        id (pk) int,
        started_by_user_id int, // foreign key
        accepted_by_user_id int, // foreign key (null if not yet accepted)
        from_notified_at timestamp,
        to_notified_at timestamp // timestamp (null if not yet accepted)
    )
    message (
        id (pk),
        conversation_id int, // foreign key
        is_forward boolean, // true = a->b, false = b->a
        message_text varchar, // actual text of message
        received_at timestamp, // when it was sent in a server message
        sent_at timestamp // when it was picked up in a server message
    )
    
    你担心饼干的安全性。如果使用会话cookies,则意味着只有启动会话的用户才能使用PHP提供给它的会话ID(有几个例外:恶意第三方通过脚本注入窃取cookie或通过窃听捕获数据。如果您担心这些事情,您可以使用SSL并在XSS上阅读,但我认为这超出了大学课程的范围)

    长话短说,你选择了一个不平凡的项目!祝你好运,如果有什么你不明白的,把它分解成更小的部分,直到每个部分都是编程问题


    现在,你可以用sockets来做这个项目,但是你应该在开始跑步之前学会走路。我建议你先用这种方法试试(因为它更容易,但仍然足够难)如果你能做到这一点,请转到套接字。

    可以发布
    js
    php
    ?对于一个大学项目,我认为启动AJAX操作的
    setInterval
    就足够了。你可以查看套接字,但据我所知,这需要一种特殊的长轮询服务器。没有什么内在的使用
    setInterval
    和AJAX治愈-你能在这里扩展你担心的吗?没有任何代码,我肯定我们做不了多少。@halfer:我担心
    cookies
    。Bcz我使用HTML作为前端和PHP后端,所以任何人都可以轻松检查cookie数据。还有一个原因是
    setInterval会给带宽和用户端进程带来不必要的负担。因此,我需要一个更聪明的主意,可以直接向另一个终端用户发送消息,然后回复。
    “Is套接字适用于此推送通知。”