首页 > 解决方案 > 有没有办法为当前正在查看它的每个人刷新页面?

问题描述

所以我正在创建一个聊天室,我目前设置它的方式是,当有人点击发送按钮时,它会将消息写入日志文件。同一窗口中的单独框架设置为通过file_get_contents('log.txt')2 秒刷新循环 ( <meta http-equiv="refresh" content="2"/>) 回显 log.txt 的内容。我可以这样,但我不想让网站超载。我想到了一个更好的解决方案,那就是在有人点击发送按钮时为所有连接的用户重新加载消息窗口。

这是控制该按钮的代码:

<?php
session_start();
echo "<html>";
echo "<head></head> <body>";
echo "<form action='newmessage.php', method='POST'>";
echo "<input type='text' name='message' style='background-color:#202020; color:#FFFFFF;' required minlength='1' maxlength='5000' size='125'/>";
echo "<input type='submit' name='Send' value='Send' style='background-color:#4a4a4a; color:#FFFFFF;'/>";
echo "</form>";
if (ISSET($_POST['message'])) {
$file = "log.txt";
$handle = fopen($file, "a");
fwrite($handle, $_POST['message']);
//
//
//
//
// Insert global page reload code here
//
//
//
//
}
echo "</form>";
echo "</body>";
echo "</html>";
?>

那么我该怎么做呢?我基本上是一个完整的 php 菜鸟,所以如果我遗漏了一些明显的东西,请告诉我。

此致,

阿迪

标签: phphtml

解决方案


显示的当前概念和代码有很多需要改进的地方。

正如评论中提到的,应该采用两个明确的概念:

1) 使用数据库

数据库是一种处理任意数据分类的更有效和经济的方式。

1 a) 因此,数据库,当“发送”消息时,您可以将其保存到数据库表中,其中包含一组列,例如:

chat_id | sender_id | date_sent           | message      | deleted
--------------------------------------------------------------
    1   |      1    | 2021-08-20 14:45:23 | Hey this     |  <null> 
                                            is my first 
                                            message

1 b) 一旦你有一个存储消息的系统,你就可以查看系统以检测何时找到新消息(未标记为已删除)并进行相应更新,这就是 AJAX Javascript/JQuery 出现的地方替换刷新页面:

2)不要刷新你的整个页面

这个建议有一些细微差别,但它是这样的——您应该使用 JQuery 和 AJAX仅刷新页面中已更改的部分。这意味着当您的最终用户正在编写消息时,他们不会在您刷新页面时丢失它,这也意味着您正在最大限度地减少数据在最终客户端浏览器和您的服务器之间来回流动的重复开销。

3)仅刷新“聊天”区域并使用异步查询(AJAX)执行此操作

创建一些AJAX 查询以每隔 X 秒(通常每 2-5 秒)检查一次服务器,并查看数据库中的数据是否已更改。通常,您可以使用MySQL 下一个自动增量测试器来执行此操作,因此您的 JQuery 保存一个具有下一个 auto_increment 值的变量,然后当此测试返回一个更高的值时,这意味着至少一条新消息已保存到数据库中,因此然后,您可以运行另一段 PHP/MySQL 来提取这些新消息并显示它们:-)

因此,您有一个名为的 HTML 代码块,例如<div id='conversation'></div>,然后使用 JQuery 使用 MySQL 表中的格式化聊天文本填充该块,并且每 3 秒(例如)测试表以查看是否有更改并获取所有行更高或等于来自 auro_increment 的变量数。


我不会对此做太多介绍,因为这只是一个概括性的概述,但这个概念将是比您当前相当繁琐的系统更好的方法。祝你好运。


推荐阅读