Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
xooass 发表于 2011-8-1 10:37:40 | 显示全部楼层 |阅读模式
本帖最后由 xooass 于 2011-8-1 10:38 编辑

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

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. function checkflood() {
  2. global $_G;
  3. $memcache_obj = memcache_connect('127.0.0.1', 12000);
  4. $lastpost2 = memcache_get($memcache_obj, "uid{$_G['uid']}");
  5. if(!$_G['group']['disablepostctrl'] && $_G['uid'] && $lastpost2) {
  6. $isflood = $_G['setting']['floodctrl'] && (TIMESTAMP - $_G['setting']['floodctrl'] <= $lastpost2);

  7. if(empty($isflood)) {
  8. return FALSE;
  9. } else {
  10. return TRUE;
  11. }
  12. }
  13. return FALSE;
  14. }
复制代码




评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-24 00:33 , Processed in 0.020876 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表