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()
把整个函数注释掉,然后在下面写入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function checkflood() { global $_G; $memcache_obj = memcache_connect('127.0.0.1', 12000); $lastpost2 = memcache_get($memcache_obj, "uid{$_G['uid']}"); if(!$_G['group']['disablepostctrl'] && $_G['uid'] && $lastpost2) { $isflood = $_G['setting']['floodctrl'] && (TIMESTAMP - $_G['setting']['floodctrl'] <= $lastpost2); if(empty($isflood)) { return FALSE; } else { return TRUE; } } return FALSE; } |