gpt4 book ai didi

PHP的无限循环或jQuery setInterval?

转载 作者:行者123 更新时间:2023-12-03 22:53:52 26 4
gpt4 key购买 nike

Js:

<script>
function cometConnect(){
$.ajax({
cache:false,
type:"post",
data:'ts='+1,
url: 'Controller/chatting',
async: true,
success: function (arr1) {
$(".page-header").append(arr1);
},
complete:function(){
cometConnect(true);
nerr=false;
},
dataType: "text"
});
}
cometConnect();
</script>

Php:
public function chatting()
{
while(true)
{
if(memcache_get(new_message))
return new_message;
sleep(0.5);
}
}

这是比设置setInterval更好的解决方案,该setInterval连接到PHP方法,该方法每隔1秒就会返回消息(假设1秒增加+每5秒增加0.25)?

如果我使用第一个解决方案,则可能可以使用sleep(0.5),它会立即向我发送消息,因为php循环很便宜,不是吗?

因此,哪种解决方案更好(更重要的是,它需要更少的资源?)。因为将有数百个这样的聊天。

另外,第一个解决方案会引起问题吗?假设我要重新加载页面,或者每30秒停止执行一次,这样我就不会收到502 Bad Gateway。

编辑:我认为第二个解决方案更好,所以我将重新实现我的网站,但是我很好奇这是否会给用户带来麻烦?会发生无法预料的事情吗?
我注意到的第一个问题是,除非至少有一条新消息,否则您无法进入其他页面。

最佳答案

聊天是一对多的通信,而聊天中的每个人都可以发送消息,并且可以接收其他人的消息。

这两个 Action (发送,接收)是连续发生的。因此,这看起来像是一个无休止的循环,而用户可以进入(加入聊天)并退出(离开聊天)。

  • 输入
  • 发送消息
  • 接收消息
  • 退出

  • 因此,循环在客户端看起来像这样(伪代码):
    while (userInChat)
    {
    if (userEnteredMessages)
    {
    userSendMessages(userEnteredMessages)
    }
    if (chatNewMessages)
    {
    displayMessages(chatNewMessages)
    }
    }

    正如您在问题中已经提到的那样,问题在于为网站实现这种聊天。

    要为网站实现这样的“循环”,首先要面对的情况是您不想在这里有实际的循环。只要用户处于聊天状态,它就会运行并运行。因此,您想随时间分配循环的执行情况。

    为此,您可以将其转换为事件函数的集合:
    ChatClient
    {
    function onEnter()
    {
    }
    function onUserInput(messages)
    {
    sendMessages = send(messages)

    display(sendMessages)
    }
    function onReceive(messages)
    {
    display(messages)
    }
    function onExit()
    {
    }
    }

    现在可以触发事件而不是循环。随时间推移触发这些事件的实现只剩下左手,但目前这还不是很有趣,因为这将取决于聊天数据交换的实际实现方式。

    聊天客户端总是(在某种程度上)连接到一个远程点,以发送其自己的消息并从中接收新消息。

    这是某种聊天消息流。同样,这看起来像一个循环,但实际上它是一个流。就像在聊天客户端循环中一样,在某个时间点,它挂接到流上,并从该流发送输入(写)和接收输出(读)。

    这在上面的ChatClient伪代码中已经可见,当用户输入一个或多个消息然后将要发送(写入)时会发生一个事件。阅读消息将在onReceive事件函数中可用。

    由于流是有序的数据,因此需要有序。因为这都是基于事件的,并且有多个客户端可用,所以这需要一些专门的处理。由于顺序是相对的,因此只能在其上下文中使用。上下文可能是时间(一条消息先于另一条消息出现),但是如果聊天客户端将另一个时钟作为服务器或另一个客户端,则我们不能将现有时钟用作消息顺序的时间源,因为它通常,WAN中的计算机之间会有所不同。

    相反,您可以创建自己的时间来排列所有消息。通过在所有客户端和服务器之间共享时间,可以实现有序流。只需在中心位置对消息编号即可轻松实现。幸运的是,您的聊天位于服务器的中心位置。

    消息流从第一条消息开始,到最后一条消息结束。因此,您要做的就是给第一个消息赋予数字1,然后每条新消息都将获得下一个更大的数字。我们称其为消息ID。

    因此,无论您使用哪种服务器技术,聊天都知道消息的类型:带ID的消息和不带ID的消息。这也代表消息的状态:不是流的一部分或一部分。

    与流无关的消息不是用户已经输入但尚未发送到服务器的消息。服务器收到“免费”消息时,可以通过分配ID将它们放入流中:
        function onUserInput(messages)
    {
    sendMessages = send(messages)

    display(sendMessages)
    }

    如该伪代码示例所示,这就是这里发生的情况。 onUserInput事件获取尚不属于流的消息。 sendMessages例程将返回其流式表示,然后将其显示。

    然后,显示例程可以按消息的流顺序显示消息。

    因此,无论客户端/服务器通信是如何实现的,使用这种结构,您实际上都可以粗略地处理基于消息的聊天系统,并将其与底层技术脱钩。

    服务器需要做的唯一一件事就是获取消息,为每个消息指定一个ID,然后返回这些ID。当服务器将消息存储到数据库中时,通常会完成ID的分配。好的数据库会为消息正确编号,因此无需做太多事情。

    另一个交互是从服务器读取新消息。为了通过网络有效地执行此操作,客户端会告诉服务器它喜欢从中读取哪个消息。然后,服务器将从那时起将消息传递给客户端。

    如此所示,从一开始的“无尽”循环到现在已变成具有远程调用的基于事件的系统。由于远程调用价格昂贵,因此最好使它们能够通过一个连接传输大量数据。其中一部分已经在伪代码中,因为可以向服务器发送一个或多个消息,并一次从服务器接收零个或多个消息。

    理想的实现方式是与服务器建立一个连接,从而允许以全双工方式向服务器读取和写入消息。但是,javascript中尚无此类技术。这些东西正在使用Websockets和Webstream API等进行开发,但是现在让我们简单一些,看看我们拥有什么:无状态HTTP请求,服务器上的一些PHP和MySQL数据库。

    消息流可以在数据库表中表示,该数据库表具有用于ID和其他字段的自动递增的唯一键来存储消息。

    写事务脚本将仅连接到数据库,插入消息并返回ID。这是一个非常常见的操作,应该很快(mysql具有某种memcache桥,这应该使存储操作更加快速和便捷)。

    读事务脚本同样简单,它将只读取ID高于传递给它的所有消息并将其返回给客户端。

    使这些脚本尽可能简单,并优化对商店的读写时间,以便它们可以快速执行,即使通过纯HTTP聊天也可以完成操作。

    仍然您的Web服务器和整个Internet连接可能不够快(尽管存在 keep-alive)。

    但是,HTTP暂时足以测试您的聊天系统是否在没有任何循环的情况下正常工作,而不是客户端或服务器端。

    使服务器变得简单也很好,因为每个客户端都依赖它们,所以它们应该只做自己的工作,仅此而已。

    通过为聊天客户端提供发送和接收功能的不同实现,您可以随时更改可以与聊天客户端交互的服务器(或提供不同类型的服务器)。例如。我在您的问题中看到您正在使用 cometd ,这也应该可以正常工作,直接为 cometd 实现服务器可能很容易。

    如果将来可以更轻松地访问websocket(出于安全考虑可能永远不会如此),那么您也可以为websocket提供另一种服务器。只要流的数据结构是完整的,它就可以与彼此相邻的不同类型的服务器一起使用。数据库将负责一致性。

    希望这会有所帮助。

    需额外注意的是:HTML5提供了一个名为 Stream Updates with Server-Sent Events以及 online demoPHP/JS sources的东西。 HTML 5功能已经在javascript中提供了一个事件对象,该事件对象可用于创建示例性聊天客户端传输实现。

    关于PHP的无限循环或jQuery setInterval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637276/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com