教你巧用PHP+MySQL搭建一个聊天室

2 02 3 年 4 月,我尝试找出聊天室代码。
当时我在宿舍,电脑屏幕开着。

表设计部分,mysql> CREATETABLE chat (chtime DATETIME, nick CHAR(2 5 5 ) NOT NULL, word CHAR(2 5 5 ));我记得这句话。
Chtime是时间,nick是昵称,word是演讲内容。
2 5 5 个字符就足够了。

对于网页设计来说,main.php是主体,cdisplay.php显示语音,talk.php发送语音,login.php登录。
这将默认开始运行。

login.php代码非常简单。
用户输入他们的昵称并将其保存在cookie中。
这样昵称就会传递到 main.php。
我尝试使用会话,但 cookie 更简单。

Main.php 使用框架集将其分为两个框。
一个用于语音显示,另一个用于语音输入。
代码看起来不错。

cdisplay.php 使用 Meta Equiv=refresh。
每 5 秒刷新一次。
它从数据库聊天表中提取数据并显示它。
最后一条语句显示在顶部。
然后,该代码还会删除以前的语句,以防止数据库无限增长。
我不确定这部分删除了多少行,但看起来代码中写了数字。

speak.php 接收用户输入的语音并将其存储在数据库中。
该表单提交给 talk.php 本身。
这样,当用户单击马时,数据就会输入数据库。

运行的时候感觉响应有点慢。
也许MySQL压力很大,因为并发用户太多了。
没关系。
当时的情况就是这样。
由你决定。

如何搭建php+mysql环境

说实话,搭建环境并不难,得一步步去做。

1 .首先去http://phpnow.org下载。
该页面可以四处查看,所以不用担心。
查看右侧并单击“立即下载”。

2 折旧后,不要驱动在C盘,而是在另外一个驱动器,驱动D盘。
下载时,用中文命名目录,如“D:\phpstudy2 02 1 ”。

3 解压后,找到Setup.cmd文件并双击。
对于 Apache 和 MySQL 版本,选择一个并单击“下一步”。

4 选择MySQL版本并按Enter键。
然后你会被要求输入 root 密码。
这个你可以随意设置。
我把它称为“根”。
您应该记住该密码,因为稍后可以使用它。

5 输入密码后,按 Enter 键。
安装后,将弹出一个网页。
地址是http://1 2 7 .0.0.1 首先关闭。

6 现在他们正在尝试制作一个 php 页面。
找到 htdocs 目录并创建一个新的 1 .php 文件。
内容只有一行: php <?php echo "php 我来了"; ?>
保存。

7 打开浏览器,输入http://1 2 7 .0.0.1 /1 .php,然后按Enter键。
当你看到“php,我来了”时,就说明它已经安装好了。

8 这个1 .php还没有使用mysql。
如果php要连接数据库,必须先建好库。
有些开源程序会自己构建,所以不再赘述。

9 建库时,浏览器会返回http://1 2 7 .0.0.1 当您看到红色框时,单击它。
用户名和密码是mysql root和安装集成包时设置的密码。

1 0当点击phpmyadmin时,左侧是数据库列表,暂时忽略它。
在右侧框中,点击“新建”,并命名你想要的库,例如“芝麻河”。
选择“utf8 ”作为描述。
构建完成后,将出现一条成功消息。

1 1 搭建完成后,左边就看不到了。
请修复它。
然后点击新创建的库并创建一个表。

记住这些参数:数据库本地主机、数据库名称zhimahe、root用户、root密码。
PHP 和 MySQL 很常见。
如果您想安装开源软件,只需将文件放在 htdocs 目录中并阅读其安装说明即可。

关于数据库数据自动更改的程序编写(网站程序是PHP+MYSQL)

说实话,用PHP来模拟定时器确实很有趣。
当我在论坛上开发积分系统时,我使用了类似的想法。
然而,如果你的逻辑出现错误,服务器的CPU在几分钟之内就耗尽了,你就需要非常小心了。

例如,我在某个 VPS 上构建了一个事件系统,用户每 3 0 分钟获得 1 积分。
直接用时间戳来计算比较麻烦,所以我就用你提到的方法。
在数据库表中添加一个last_updated_at字段来存储时间戳并在用户请求时运行一个函数:
php 函数 getPoints($userId) { $db = new mysqli ( 'localhost' , '用户' , 'pass' , 'db' ); $stmt = $db->prepare("SELECT 点,last_updated_at FROM 用户 WHERE id = ?"); $stmt->bind_param("i", $userId); $stmt->execute(); $result = $stmt->get_result(); $user = $result->fetch_assoc(); if (!$user) 返回 null; $现在=时间(); $timeDiff = $now
$user['last_updated_at']; // 每1 8 0秒加1 分 如果($timeDiff >= 1 8 0){ $increment = 下限 ( $timeDiff / 1 8 0 ); $stmt = $db->prepare("更新用户SET point = point + ?, last_updated_at = ? WHERE id = ?"); $stmt->bind_param("iii", $increment, $now, $userId); $stmt->execute(); } 返回 $user['points'];
不过,要注意一些细节:如果同时有很多用户请求,加点的时候最好屏蔽掉。
在我当时的测试中,我发现如果三个用户同时搜索,结果只能加0.5 分——这个坑困扰了我很长时间。
后来我通过使用 SELECT ... FOR UPDATE 解决了这个问题。

另一个问题是,如果用户长时间不活动,他们的last_updated_at会积累特别大的时间差。
比如一个用户半年没有登录,下次登录时系统会直接给你加5 00积分,这显然是不合理的。
后来我加了一个判断:如果时差超过2 4 小时,就会重置为当前时间,只统计最后一天的积分。

说白了,这个算法适合简单的场景。
不要在像电商这样需要每分钟计算折扣的场景中使用。
你想想看,如果每秒都有用户请求,那么计算量是相当可观的。
我的一个朋友以前用过这个方法,但是服务器突然崩溃了。
日志显示CPU 1 00%卡住,积分加起来——服务器只有1 核、1 G。
你觉得很惨吗?
我个人还没有对此进行高并发测试。
我记得的数据是,每秒处理1 00个请求时,CPU大概会提升到7 0%左右。
但建议您做一下压力测试。
毕竟不同的PHP配置和数据库是有很大不同的。