Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 平面文件与数据库-速度?_Php_Mysql_Flat File - Fatal编程技术网

Php 平面文件与数据库-速度?

Php 平面文件与数据库-速度?,php,mysql,flat-file,Php,Mysql,Flat File,我正在制作一个聊天程序,我需要一个储存信息的地方。客户端将每隔x秒使用最后接收到的消息id联系服务器,服务器将在客户端加入的房间中找到id高于该id的所有消息 因为我不打算永远存储东西,所以我考虑使用平面文件(每个房间一个,以及直接消息)只存储最后40条左右的消息。然而,我认为与比较数字相比,数据库会更快 我应该使用什么样的数据存储方法 平面文件可能会快一点,但从长远来看,它最终会出现更多的错误,因为您不必只从room=nnn和ID>yyy的消息中执行SELECT*操作,而必须加载文件,解析它,

我正在制作一个聊天程序,我需要一个储存信息的地方。客户端将每隔x秒使用最后接收到的消息id联系服务器,服务器将在客户端加入的房间中找到id高于该id的所有消息

因为我不打算永远存储东西,所以我考虑使用平面文件(每个房间一个,以及直接消息)只存储最后40条左右的消息。然而,我认为与比较数字相比,数据库会更快


我应该使用什么样的数据存储方法

平面文件可能会快一点,但从长远来看,它最终会出现更多的错误,因为您不必只从room=nnn和ID>yyy的消息中执行
SELECT*操作,而必须加载文件,解析它,扫描每行的消息ID,转到正确的消息,然后读取它

这只是第一个问题。一个文本文件不支持由多个用户编写(如果两个人同时在同一个房间发帖怎么办?),并且很容易损坏


综上所述,我认为使用DB总体上更好,即使它是像SQLite这样简单的东西,它具有出色的PHP支持。但是,考虑到许多用户的条件,MySQL可能是一个更好的选择。此外,MySQL具有出色的缓存功能,因此大多数情况下,最新的数据将直接来自RAM,并且提供的速度将快于用PHP扫描文本文件的速度。

一般来说,数据库的速度要快得多,因为索引可以让您直接访问服务器必须发送的记录

OTOH,只有40条左右的消息,很可能可以放入RAM中,而且记录如此之少,即使是最简单的线性搜索例程也比单个HD访问快得多

不过,使用数据库要容易得多,我使用它只是为了简单,而不是为了速度。此外,如果您有很多并发的房间,那么自己编写这些房间意味着有很多机会出现小的、琐碎的bug,这些bug会不必要地延迟开发


只需使用数据库即可。

似乎您根本不必保留聊天记录,那么您为什么要考虑使用永久数据存储(数据库或平面文件)方法呢?您可以使用内存缓存软件(如Memcashed)来实现这一点,它比数据库或平面文件快。

尽管这是一个老问题,我还是会在这里发表意见。对于速度、可靠性和易用性,DB显然是一个简单的选择。。。很多人都忽略了一个主要的警告,那就是大多数共享主机(最常见的web托管形式)一次只允许15个左右的连接,即使是VPS通常也只允许100-200个,专用的是500个或更多。这意味着,如果你有(n)个用户每隔(s)秒共享一次,那么这些连接将很快被占用,如果你同时运行任何类型的CMS,甚至更快。在VPS上开发自己的聊天室代码的过程中,我自己也面临着这些问题。 到目前为止,我的方法是这样的

  • 确保传递lastMessageReceived变量以限制响应
  • 如果公共聊天室通过时间戳过滤器以及上述
  • 如果可能的话,使用数据库缓存引擎,比如启用查询缓存的MySQLnd,并将TTL设置为您的池速率
  • 不要对你的共享率发疯1-2秒的间隔可能看起来很整洁,很快,但它会扼杀你的连接数。将其降低到5秒甚至更多并不会真正产生巨大的差异,用户可能不会注意到,并且您的服务器负载会轻得多。甚至考虑在高负载期间增加自身的变量池速率。
  • 编写ajax以使用timeout而不是interval进行池,并将timeout调用放在ajax成功回调中,这样可以防止请求在峰值usage期间堆积
  • 最大的一个是,如果使用一个有很多用户的共享聊天室,编写自己的代码将SQL查询缓存到json文件中,并将其提供给ajax请求,然后编写一些自定义TTL代码来检查它的年龄,并在请求期间根据需要重新填充它,如果您的主机允许,CRON在这里将非常有用。年龄检查文件并将AJAX请求重定向到该文件是一项更高级别的功能,与查询数据库相比,服务器开销非常小。不要在PHP中解析文件以过滤旧消息,将第一条消息存储在文件名中,如
    chat_243.json
    ,并将其保存为已格式化的json,然后在PHP中收到请求且
    lastMessageReceived=243
    时提供整个文件。由于这将创建多个文件,您将需要一个功能来清理早于(m)分钟的文件,但这也是服务器的轻负荷工作

还有一些选项,如为聊天和套接字(node.js)设计的DB引擎,但这些需要比典型的托管帐户更多的服务器调整,出于我的目的,我一直在写我的聊天室,记住它可能会在某个时候部署到共享服务器。

好的,我肯定会使用数据库。关于多个用户同时交谈,由于我使用的是php,第二条消息不会被放入队列中,在第一条消息完成后执行吗?php不会神奇地围绕简单的文件写入创建事务。总是有机会在磁盘上得到半条记录,而在你的下半条记录被写入之前,另一个工作人员添加了它自己的记录。有一些不太复杂的方法,但是它们的效率比真正的数据库低很多。最后一个问题——表中的条目越多,选择的速度就越慢,对吗?那么,我不应该为每个房间创建一个表吗?@gladoscc:如果您的表上有适当的索引,那么从100行或100000行数据中筛选数据(假设您希望返回的实际数据集是sam)之间的差异将非常小