discuz!x2利用memcache来解决发帖重复提交的问题

尽管很多论坛已经开了防灌水设置,但有时候依然会出现帖子被重复提交了很多次的问题。

1,防灌水原理。

当用户发帖的时候,会记录一个用户最后发帖时间的信息。同样,当用户发帖的时候,也会检查用户的最后发帖时间,然后和当前时间对比,当前时间 减去 用户最后发帖时候 小于或者等于 防灌水时间的时候,就会提示用户不要重复发帖。

2,问题所在。

按防灌水的原理来看,是不应该被重复发帖才对。但是为什么还是会频繁出现重复发帖的情况呢?

这是因为当 MYSQL 压力比较大的时候,写入操作变成了慢查询,迟迟没有插入到数据库里面。这个时候如果用户多点几下提交,那么获取到的用户最后发帖时间并不是当前发帖记录到的那个时间,还是以前的老数据,那防灌水功能自然就无法生效。

3,memcache内容缓存。

Memcache是一个高性能的分布式的内存对象缓存系统,简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读写速度。没有慢查询的烦恼。写入和读取都瞬间完成。

4,解决问题。

既然重复发帖是因为慢查询而造成,那么要是把用户的最后发帖时间改为写到memcache里面去,读取的时候也从memcache里面读,那么就没有慢查询问题了。这里需要小改一下程序。以X版本为例。

(注意,以下修改必须是已经安装并且正常运行了memcached程序和加载了php的memcache模块,不然会出错)
打开include/post/post_newreply.php
搜索$message = preg_replace(‘/\[attachimg\](\d+)\[\/attachimg\]/is’, ‘[attach]\1[/attach]’, $message);
在下面加入
$memcache_obj = memcache_connect(‘127.0.0.1’, 12000);
memcache_set($memcache_obj, “uid”.$_G[‘uid’], $_G[timestamp], 0, 0);
其中127.0.0.1和12000分别是memcache的IP地址和端口号

打开include/post/post_newthread.php
搜索$message = preg_replace(‘/\[attachimg\](\d+)\[\/attachimg\]/is’, ‘[attach]\1[/attach]’, $message);
在下面加入
$memcache_obj = memcache_connect(‘127.0.0.1’, 12000);
memcache_set($memcache_obj, “uid”.$_G[‘uid’], $_G[timestamp], 0, 0);

打开source/function/function_post.php
搜索function checkflood()
把整个函数注释掉,然后在下面写入

您可能还喜欢...