MySQL连接与PHP文件访问的速度

MySQL连接与PHP文件访问的速度,php,mysql,performance,file-io,Php,Mysql,Performance,File Io,假设我有一个简单的带有LAMP的VPS设置(因此PHP和MySQL在同一台服务器上,没有附加其他字符串)。假设我想在我的网站上创建一个自己编写的ajax聊天客户端 显然,对话中的每一位参与者都必须不断地倾听对方所说的新东西。由于很有可能两个或多个参与者在同一秒钟内说了些什么(并且每秒刷新一次以上可能会导致疯狂的系统负载),在我看来,我需要为每个参与者存储自上次刷新以来发生的事情的列表 在系统负载方面,哪种方法是实现这一点的“最佳”方法?在下面的例子中,“事件”只是“任何参与者在聊天中说了什么”。

假设我有一个简单的带有LAMP的VPS设置(因此PHP和MySQL在同一台服务器上,没有附加其他字符串)。假设我想在我的网站上创建一个自己编写的ajax聊天客户端

显然,对话中的每一位参与者都必须不断地倾听对方所说的新东西。由于很有可能两个或多个参与者在同一秒钟内说了些什么(并且每秒刷新一次以上可能会导致疯狂的系统负载),在我看来,我需要为每个参与者存储自上次刷新以来发生的事情的列表

在系统负载方面,哪种方法是实现这一点的“最佳”方法?在下面的例子中,“事件”只是“任何参与者在聊天中说了什么”。显然,这也可以用于更一般的情况

(A) 使用MySQL,每秒连接一次数据库,询问参与者id=$participant\u id的事件?(然后删除所有这些,以便只提取一次)

(B) 创建一个文件$participant_id.php并将事件附加到该文件中(以php格式,以便可以包含该文件,然后在下次刷新时清空或删除该文件

(C) 有人知道其他有用的选择吗

有人知道其他有用的选择吗

如果您在PHP上搜索简单的解决方案,我可以提供两种方法:

缓存

这意味着您保留MySQL存储数据,但安装APC(此解决方案对于小型服务器和应用程序最简单、最快)或Memcached(对于使用多个服务器更好)。对于每个读取请求,您都会检查APC/Memcached中的数据,只有在删除或更新缓存时才会询问MySQL。对于每个写入请求,您都会在MySQL中插入数据并更新缓存

其他数据库


在这种情况下,您将MySQL更改为一个基于内存的DB(例如MongoDB)。并且您可能不会害怕硬盘使用。

在A和B上,您仍然可以有效地轮询。您可以轮询MySQL,这实际上并不太糟糕,或者您可以在
select()上得到通知
文件更改,但您仍需要解析以查看新数据是否是文件端的正确内容

对于概念性和易用性的支持来说,很难打败数据库,因为您不必担心锁定语义。在这种结构中,调试和消息跟踪是干净的


但是,我建议您调查
msg\u send()
msg\u receive()
(PHP的)函数将此数据放入基础消息队列。您的问题似乎是一个消息队列问题,应该通过该机制解决。

另一种方法是使用套接字连接。连接到套接字服务器守护程序的每个人都可以向守护程序发送消息,然后守护程序将发送消息向所有或部分订户发送,使聊天即时进行,无需保存数据

从客户端创建套接字连接的一个好方法是套接字IO

创建套接字服务器守护进程的一个好技术是node.js。这是一个基于服务器端事件驱动的javascript库。对于类似的事情非常有效。请参见下文


将最后x秒的文本存储在内存中似乎是可行的。您仍然可以将文本记录到mysql,但在正常情况下,您不需要向mysql索要文本,因为所需的所有内容都在内存中,或者已经发送到客户端。在我回答之前,您是否考虑过使用消息队列?@Chris:我如何将这些内容存储在内存中PHP中的RAM?或者你会推荐其他非PHP方式吗?@Xepoch:我没有考虑消息队列,我会阅读这些消息队列。谢谢你的提示!你是否需要保存聊天以供以后使用?否则,请参阅我的答案。实际上,在(B)中我只需要一个文件存在,对吗?这在资源方面应该非常便宜。但是msg_receive()如果我理解正确,这仍然是一个更好的方法?我主要担心的是,用户意外离开聊天/游戏/…会导致他们的消息队列永久保留。对于这些文件,我可以每周根据它们的时间戳手动删除旧文件,但我似乎找不到任何方法来处理消息队列。。。你可以设置多个队列,如果没有活动,可以删除队列。你还可以通过同时统计队列来找出最后一条消息的时间,这听起来很有趣,也很奇怪。我会仔细阅读这个机制。而且,用这种方式记录聊天真的不可能吗(假设人们不攻击客户端,也就是说)@user1111929“记录”聊天的确切含义是什么?你想把它全部保存在服务器上以备日后使用吗?这将是一个好处,是的。不仅是聊天示例,而且我也会将此系统用于小型多人游戏(跳棋、21点、uno等)在那里,如果应用程序崩溃,调试应用程序或捕获作弊者可能会很有用。但这不是一个大问题。@user1111929您可以在使用此方法将其发送给订阅者的同时记录所有内容。node.js允许平面文件写入和数据库连接。另一种方法是将调试客户端连接到socket服务器可以随时接收所有消息,您可以将其用于日志记录。这样,您就不会将调试代码与生产代码混用,可能会提高性能。