PHP 并发问题

爱奇途 2016-12-02 12:06:45
问题描述:
1.用户发推广链接abc.com?tuijian_id=22,给其他用户
2.其他用户访问该推广链接,每访问一次就给tuijian_id=22的用户加积分
3.开始通过获取其他用户访问的ip,进行限制;ip存在cookie里面; 如果刚开始没读取到缓存ip,则执行加积分,并给cookie赋值现在的ip;如果后面再次访问,就读取cookie的ip判断是否与目前ip相同,相同就不执行加积分了

但是用户如果快速刷新页面,如果刷5次就会加5次的积分,相当于cookie的值都是空的,每次都是执行
...全文
428 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄袍披身 2016-12-13
  • 打赏
  • 举报
回复
memcache key=> 次数 缓存的过期时间
爱奇途 2016-12-12
  • 打赏
  • 举报
回复
引用 8 楼 a641350 的回复:
在访问的链接里面不要一进去就判断给他加分,渲染页面完了之后,用ajax提交到后台,交给后台处理,这个时候可以写cookie,,js中得navigator对象可以获取到简单的客户端浏览器信息,可以用来部分判断一下,把这个数据提交给数据库去吧。
公司团队有讨论过,但是很容易暴露ajax处理接口,这样用户写个模拟程序更容易通过改接口来刷分
我是csd_ner 2016-12-08
  • 打赏
  • 举报
回复
这都是学些贴,谢谢各位
  • 打赏
  • 举报
回复
在访问的链接里面不要一进去就判断给他加分,渲染页面完了之后,用ajax提交到后台,交给后台处理,这个时候可以写cookie,,js中得navigator对象可以获取到简单的客户端浏览器信息,可以用来部分判断一下,把这个数据提交给数据库去吧。
_勿忘初心 2016-12-07
  • 打赏
  • 举报
回复
爱奇途 2016-12-07
  • 打赏
  • 举报
回复
引用 5 楼 fdipzone 的回复:
如果你是避免同时刷新多次,可以增加时间判断啊 记录 uid quota maxquota lastupdatetime(使用时间戳) 1 0 5 0 可以加个5秒内限制 update table set quota=quota+1 where uid=1 and quota<maxquota and lastupdatetime+5<unix_timestamp(now());
之前考虑过这种方法,但是如果分享出去,还是有可能同一时间内有多个人点击,比如我分享到群里面,刚好在同一时间内点开,点不开的同志多次刷新 就加大几率出现上面的问题了!
傲雪星枫 2016-12-06
  • 打赏
  • 举报
回复
如果你是避免同时刷新多次,可以增加时间判断啊 记录 uid quota maxquota lastupdatetime(使用时间戳) 1 0 5 0 可以加个5秒内限制 update table set quota=quota+1 where uid=1 and quota<maxquota and lastupdatetime+5<unix_timestamp(now());
爱奇途 2016-12-06
  • 打赏
  • 举报
回复
引用 1 楼 u013358222 的回复:
你放coolie 里面别人把浏览器缓存删了 还是可以在加分啊 我觉得还是记在表里面科学有点,记录ip就行了 虽然ip可以模拟 就算他在模拟 ip 也是在帮你推广
如果限制ip,如果是局域网内,就可能限死了,比如我宿舍6个人,都是同一个交换器出来,ip都是相同,那限制ip就不太合理了!
爱奇途 2016-12-06
  • 打赏
  • 举报
回复
引用 2 楼 fdipzone 的回复:
可以使用mysql的update,加条件去限制原子性 例如你最多可以加到5 表结构如下 uid 用户id quota 已换领次数 maxquota 最大换领次数 记录 uid quota maxquota 1 0 5 然后用update限制,update成功才处理后面的,不成功则返回。 update table set quota=quota+1 where uid=1 and quota<maxquota;
这样如果快速刷新,还是会一下子刷5次; 虽然可以防止多于5次,但是这个也不太适合!
山水天元 2016-12-02
  • 打赏
  • 举报
回复
你放coolie 里面别人把浏览器缓存删了 还是可以在加分啊 我觉得还是记在表里面科学有点,记录ip就行了 虽然ip可以模拟 就算他在模拟 ip 也是在帮你推广
傲雪星枫 2016-12-02
  • 打赏
  • 举报
回复
可以使用mysql的update,加条件去限制原子性 例如你最多可以加到5 表结构如下 uid 用户id quota 已换领次数 maxquota 最大换领次数 记录 uid quota maxquota 1 0 5 然后用update限制,update成功才处理后面的,不成功则返回。 update table set quota=quota+1 where uid=1 and quota<maxquota;

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧