将数据保存到文件和。将其保存到MySQL DB

时间:2010-11-30 12:09:45

标签: php mysql file save connection

使用PHP脚本我需要每隔5秒更新一个数字,而有人在我的页面上。所以假设我有300个访问者,每个访问者在页面上花费大约1分钟,并且他们每5秒钟停留在页面上,数字将被更改...这是每分钟总共3600个更改。我更喜欢更新我的MySQL数据库中的数字,除了我不确定是否有太多的MySQL连接(仅用于一个数字更改),当我只能更改文件中的数字时,效率是否太低。 / p>

P.S。:我不知道天气3600连接/分钟是否是一个很高的数字,但考虑到更多的访问者,一般情况如此。最有效的方法是什么?

6 个答案:

答案 0 :(得分:3)

对同一个文件每分钟执行3,600次读写操作是不可能的。它很复杂(你需要非常小心文件锁定),它会有一个糟糕的性能,迟早你的数据会被破坏。

像MySQL这样的DBMS是为并发访问而设计的。如果他们无法应对你的负载,文件将无法做得更好。

答案 1 :(得分:1)

如果用户数增加但最终会失败,但性能取决于您的服务器设置和与此更新相关的其他任务。

你可以做一个轻微的测试,并打开300个持久连接到你的数据库端,尽可能多的查询。

如果你不需要它是事务性的(执行查询的顺序并不重要)那么我建议你使用memcached(如果需要在磁盘上保存东西,则使用redis)

答案 2 :(得分:1)

文件不是事务性的,您不希望丢失计数,因此数据库是最佳选择

memcached的inc命令比数据库快,是我认为一个真正快速查看计数设置的基础

如果您每小时使用一个密钥并在页面查看发生时切换到页面:时间发生,您可以在后台处理过程收集过去一小时的计数,如果内存缓存失败则将其插入数据库您可能会丢失该小时的计数,但您不会计算或错过任何计数,并且每个期间保持计数会提供有趣的统计数据

答案 3 :(得分:1)

如果保存到文件,则必须解决并发问题(除了当前的读/写过程之外的所有过程都必须等待)。 db为您解决了这个问题。为了获得更好的性能,您可以使用memcached。

也许你可以通过另一种手段(例如,节省当前时间并在下次用户做某事时减去)来做“每个用户每5秒做一次”。这取决于你的真实问题。

答案 4 :(得分:1)

甚至不考虑尝试使用文件来处理它 - 除非你构建一个锁队列管理器,它才会起作用 - 如果你遇到所有麻烦,你也可以使用守护进程来管理值而不仅仅是队列锁。

使用DBMS是最简单的方法。

对于更高效但更大规模更深奥的方法,编写单线程套接字服务器守护程序并让客户端连接到该守护程序。 (有一个lib here用于执行套接字处理,并且有一个PEAR class用于运行PHP作为守护进程)

答案 5 :(得分:0)

使用专用的临时文件肯定是您可以拥有的最有效的磁盘访问。但是,如果服务器使用多个线程或进程,则不会保护您不受文件的并发访问。如果您想要做的是为每个用户更新1个数字,那么使用$ _SESSION子变量将起作用,我相信它存储在内存中,所以它应该非常高效。然后,您可以每个用户每5分钟轻松地将此数字存储到数据库中