Php 更好的方法是:在mysql或平面文件上单击计数器?

Php 更好的方法是:在mysql或平面文件上单击计数器?,php,mysql,file,counter,Php,Mysql,File,Counter,我一直认为使用平面文件来存储实时访问/单击计数器数据更好更快:以附加模式打开文件,锁定它,放置数据,然后关闭。然后每隔五分钟通过crontab读取一次该文件,将内容存储到DB并截断文件以获取新数据。 但今天我的朋友告诉我,这是一种错误的方式。最好有一个永久的MySql连接,并在每次单击时将数据写入DB。首先,DB可以将结果存储到内存表中。第二,即使我们存储到磁盘上的一个表中,这个文件也会被它永久打开,所以不需要在磁盘上找到它,并在每次查询时一次又一次地打开它 你觉得怎么样 UPD:我们谈论的是高

我一直认为使用平面文件来存储实时访问/单击计数器数据更好更快:以附加模式打开文件,锁定它,放置数据,然后关闭。然后每隔五分钟通过crontab读取一次该文件,将内容存储到DB并截断文件以获取新数据。 但今天我的朋友告诉我,这是一种错误的方式。最好有一个永久的MySql连接,并在每次单击时将数据写入DB。首先,DB可以将结果存储到内存表中。第二,即使我们存储到磁盘上的一个表中,这个文件也会被它永久打开,所以不需要在磁盘上找到它,并在每次查询时一次又一次地打开它

你觉得怎么样


UPD:我们谈论的是高流量的网站,每天大约有一百万个。

你的朋友说得对。写入一个文件,然后每隔5分钟向数据库发送一个cronjob?这听起来很复杂。我想不出一个不直接给DB写的好理由

此外,当您按照描述的方式写入文件时,操作将被序列化。用户在写入之前必须等待另一个用户释放锁。如果你需要它,它根本无法扩展。如果总是写入同一行,DB也会发生同样的情况,但是可以为同一个值写入多行,写入一个随机行,并在需要总计时求和


在这种情况下,使用内存表没有多大意义。如果您的数据不需要持久化,那么使用您可能已经在某处拥有的memcache并简单地增加键的值会简单得多

如果使用没有事务的数据库,您将获得与使用可靠性更高、编码更少的文件相同的底层性能


对数据库的写入可能很繁重,例如,数据库可能位于不同的服务器上,因此您有网络流量,也可能是事务性数据库,在这种情况下,每次写入至少有2次写入(如果涉及索引,可能会更多),但如果您了解所有这些内容,则可以使用数据库,利用他人数十年的工作,让您的编程任务变得轻松。

这可能会变得非常棘手,尤其是对于高流量网站。我从来没有真正写出过你所描述的内容,但我可能会将请求记录到数据库中,并定期统计它们。然后将计数结果存储在另一个表中(例如
创建表计数(weeknr TINYINT、year SMALLINT、viewcount INT);
)并删除计数的行。我将使用或mongodb。