Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 将大量点击记录到MySQL数据库的最佳实践_Php_Mysql_Caching - Fatal编程技术网

Php 将大量点击记录到MySQL数据库的最佳实践

Php 将大量点击记录到MySQL数据库的最佳实践,php,mysql,caching,Php,Mysql,Caching,这就是问题所在。比如说,我未来的PHP CMS每天需要吸引50万名访问者,我需要将他们全部记录在MySQL数据库中(参考者、ip地址、时间等)。这样,我需要每分钟插入300-500行,然后再更新50行。主要的问题是,每当我想插入新行时,脚本就会调用数据库,也就是每次有人点击页面时 我的问题是,有没有办法先在本地缓存传入的点击(对于apc、csv…?,什么是最好的解决方案)并每隔10分钟定期将它们发送到数据库?这是一个很好的解决方案,针对这种情况的最佳做法是什么?一个常用的解决方案: 您可以实现一

这就是问题所在。比如说,我未来的PHP CMS每天需要吸引50万名访问者,我需要将他们全部记录在MySQL数据库中(参考者、ip地址、时间等)。这样,我需要每分钟插入300-500行,然后再更新50行。主要的问题是,每当我想插入新行时,脚本就会调用数据库,也就是每次有人点击页面时


我的问题是,有没有办法先在本地缓存传入的点击(对于apc、csv…?,什么是最好的解决方案)并每隔10分钟定期将它们发送到数据库?这是一个很好的解决方案,针对这种情况的最佳做法是什么?

一个常用的解决方案:


您可以实现一个计数器,在该计数器中,您可以增加一次访问,并针对每100次(或1000次)点击向数据库推送一次更新

我们通过在每台服务器上本地存储CSV,然后使用一个微小的cron作业将条目推送到数据库中来实现这一点。这是为了避免更需要高可用性的MySQL数据库-数据库应该能够毫无问题地处理大量插入。

将它们保存到基于目录的数据库(或平面文件,视情况而定)中的某个位置,并在某个特定时间,使用PHP代码将它们插入/更新到MySQL数据库中。您的php代码可以使用Cron定期执行,因此请检查您的服务器是否有Cron,以便您可以为此设置时间表,比如每10分钟一次


请查看此页面:。一些代码已经在云中编写好,可以供您使用:)

对于大量的写操作,您可能会发现这种数据更适合mongodb或couchdb

一种方法是使用Apacheaccess.log。通过在apache中使用croolog实用程序,可以获得非常好的日志记录。Cronolog将处理文件中大量行的存储,并可以根据卷日、年等进行轮换。使用此实用程序将防止Apache遭受日志写入的痛苦

然后,正如其他人所说,使用基于cron的作业来分析这些日志,并在MySQL中推送您想要的任何摘要或原始数据


您可以考虑使用专用数据库(甚至数据库服务器)进行写密集型作业,并进行特定设置。例如,您可能不需要InnoDB存储并保留一个简单的MyIsam。你甚至可以想到另一个数据库存储(正如@Riccardo Galli所说)

500k每天,每秒只需5-7次查询。如果每个请求将被服务0.2秒,那么您将有几乎0个同时查询,因此无需担心。
即使您将拥有5倍多的用户,所有这些都应该可以正常工作。
您只需使用并调整mysql即可。
关于调优:-有一个非常有用的脚本(不会更改任何内容,只需向您展示如何优化设置的技巧)

您可以先使用memcache或APC在那里写入日志,但使用INSERT-DELAYED-MySQL将完成几乎相同的工作,而且会做得更好:)


不要为此使用文件。DB提供的锁比PHP好得多。编写有效的互斥并不是那么微不足道,所以让DB(或MyCasic,APC)做这个工作。

< P>如果你必须直接登录到MySQL,考虑使用两个数据库。一个是为快速插入而优化的,这意味着除了可能的自动增量主键之外,没有其他键。还有一个,你要查询的所有东西都有钥匙,为快速搜索而优化。定时作业会定期将命中数据从insert only复制到只读数据库,这样您就可以两全其美了。唯一的缺点是,您的可用统计数据只会与上一次“复制”运行时一样新鲜。

我以前也见过一种系统,它将数据记录到每个web服务器上本地光盘上的平面文件中(如果使用多个进程,请注意只执行原子附加),并使用守护进程或cron作业定期将它们异步写入数据库

这似乎是普遍存在的最佳解决方案;如果审计数据库关闭,您的web应用程序仍然可用,并且如果数据库因任何原因运行缓慢,用户不会受到性能差的影响


我能说的唯一一件事是,确保您对这些本地生成的文件进行了监视-累积肯定表明存在问题,否则您的Ops工程师可能不会注意到。

因为
插入延迟
仅受
MyISAM
支持,所以对于许多用户来说,这不是一个选项

我们使用延迟执行与特定签名匹配的查询

这将需要一个自定义Lua脚本,和


该脚本将实现用于存储查询字符串的队列数据结构,以及用于确定延迟哪些查询的模式匹配。一旦队列达到一定的大小,或者经过一定的时间,或者发生任何事件X,查询队列将在每个查询发送到服务器时清空。

您可以使用使用beanstalk或IronQ的队列策略,使用内存缓存而不是文件缓存(如其他答案所示)要快得多+1对于合理的报告,您需要SQL。这不是“大量写入操作”。尝试在XXXdb中执行GROUP BY(用您最喜欢的nosql替换XXX)文件crontab.php无法在页面上下载“因此,请尝试查找不同的脚本:)Internet上有数千个这样的脚本。此外,在那个大表上跟踪唯一访问者(每个ip地址)的最佳方法是什么?
选择DISTINCT(ip)从access_log
+1获取关于
插入延迟的更完整答案和讨论