duguxiaohuai
V2EX  ›  PHP

想咨询个 PHP 定时的问题

  •  
  •   duguxiaohuai · Nov 27, 2016 · 5199 views
  •   You need to sign in to view this topic
    This topic created in 3628 days ago, the information mentioned may be changed or developed.

    现在平台要加入会员机制,会员每个月 5 元钱,最低一个月,想问下如何计算这一个月时间,是将到期的时间计算出来,到了那个时间执行还是如何操作?用户量比较大,大概几十万会员。

    34 replies  •  2016-11-29 16:13:17 +08:00
    kchum
    kchum
    Nov 27, 2016 via iPhone
    1
    没有会员的有限时间这个字段咩
    sagaxu
    sagaxu
    Nov 27, 2016
    2
    加索引(is_member, expire_time),每次查 is_member=1 and expire_time < 当前时间的,关闭会员资格。可以每 5 分钟检查一次,每批 limit 10000 条,处理到没有为止。
    xavier007
    xavier007
    Nov 27, 2016
    3
    会员到期一般不都是专门一个字段存储到期日期么? 使用某功能前线判断是否到期
    SlipStupig
    SlipStupig
    Nov 27, 2016
    4
    不知道你用什么数据库,但是大致思路差不多,我认为根本不要,定时去排查到期的,除非你需要去通知到期用户,所以提一下我的一些愚蠢的想法:

    sql:设置一个到期,每次用户登录的时候去检查这个字段就行了,如果他花钱了钱不登录,也就是根本没用你服务,你也不用管他,要考虑一个例外就是用户可能没有付费,这个字段就是-1 或者其他,要去通知的话就是: expired != -1 and today > expired,这样就可以了
    nosql :更好办了,直接弄个 collections ,设置一个到期日期,到时间了 token 自动 drop 掉了,找不到 token 的都是到期了的全是到期了的
    Immortal
    Immortal
    Nov 27, 2016
    5
    1 设置一个到期时间 遇到功能限制的地方 先判断会员等级 再判断时间 如果时间到了 但是会员等级还是高级 update
    2 设置一个任务计划,每天检查一次所有会员是否到期
    eDeeraiD0thei6Oh
    eDeeraiD0thei6Oh
    Nov 27, 2016
    6
    付费会员单独一张表记录
    Curtion
    Curtion
    Nov 27, 2016
    7
    4 楼的不错
    1.只有当这个用户登陆 /操作时才执行查询命令,看会员是否到期
    2.如果是需要会员功能来达到某个功能,那么在实现这个功能之前可以检查一下会员是否到期
    zhaolion
    zhaolion
    Nov 27, 2016
    8
    如果你使用了 redis ,可以用 redis 缓存用户信息,然后支付 vip 时候,使用 redis 命令 EXPIRE 设置一个 vip_key 的过期时间为一个月,然后每次都会检查 redis 缓存里面的这个 vip_key 是否消失了, get 这个 vip_key 为 null 就证明 vip 已经到期了,后续可以做更多操作
    txlty
    txlty
    Nov 27, 2016
    9
    最古老最普通的实现方式,请求时判断。
    ichou
    ichou
    Nov 27, 2016 via iPhone
    10
    @zhaolion 支付类信息放在 redis 的话,记得在数据库里做好冗余或者做好持续化。想想 redis 宕一下的话,那酸爽 😂
    ichou
    ichou
    Nov 27, 2016 via iPhone
    11
    是持久化 上条指误
    raincious
    raincious
    Nov 27, 2016
    12
    这就是用 Model 的好处:

    添加一个字段 expire_time ,然后

    function isExpired(): bool {
    return $this->expireTime < time();
    }

    后面的操作用这个方法就好了。
    zhaolion
    zhaolion
    Nov 27, 2016
    13
    @ichou redis 和数据库都会冗余的,并且肯定做持久化,这是可用性问题
    onlyhot
    onlyhot
    Nov 27, 2016 via iPhone
    14
    请求时验证。
    定时任务跑。
    lianxiaoyi
    lianxiaoyi
    Nov 27, 2016 via Android
    15
    记一个用户到期时间,然后记一个是否开通了 vip 标志,然后 2 分钟去数据库执行一次 update 表 set a=非会员 where time<=当前时间!几十万数据毫秒级别完成!
    jimzhong
    jimzhong
    Nov 27, 2016
    16
    在表中增加用户的会员到期时间,在用户登录和使用会员服务时检查即可。
    还可以写个 cron 脚本,每天午夜扫一次数据库,去掉过期会员的会员标志。
    cncqw
    cncqw
    Nov 27, 2016
    17
    有这么复杂吗,用户表加个会员到期时间字段,每次登录和当前时间判断一下
    techmoe
    techmoe
    Nov 27, 2016 via Android
    18
    请求时验证吧。。逻辑设计好没什么太大问题的
    components
    components
    Nov 28, 2016
    19
    定时任务+redis 跑
    aerostone
    aerostone
    Nov 28, 2016
    20
    几十万用户应该会发通知的吧
    yao978318542
    yao978318542
    Nov 28, 2016
    21
    我猜你们肯定是要发短信或者微信模板或者是邮箱之类的提示用户该交钱了,所以可以再服务器上跑个定时查询!用户开通会员的时候插入一个到期时间的字段,判断这个字段就 ok 了
    XueRainey
    XueRainey
    Nov 28, 2016
    22
    可以考虑授权,通过验证会员接口获得授权 token 然后再去请求会员服务,这样就可以在验证会员接口进行会员到期验证了。那些花了钱不用会员服务的,其实你也不用管他。
    numberwolf
    numberwolf
    Nov 28, 2016
    23
    至于检查的话完全可以跑一个 crontab 检查,反馈到 redis
    hoythan
    hoythan
    PRO
    Nov 28, 2016
    24
    @cncqw 你们是不是从来都不考虑如果这个用户永远不登录,别人看这个账号永远都是会员的问题?
    realpg
    realpg
    Nov 28, 2016
    25
    分布式解决这个问题
    每次请求自动执行 update user set vip=0 where expire<= {now} limit 1
    cncqw
    cncqw
    Nov 28, 2016
    26
    @hoythan 显示会员状态的时候也要先判断啊,不然你在界面上怎么区分会员和非会员???
    hoythan
    hoythan
    PRO
    Nov 28, 2016
    27
    @cncqw 你的意思是账号 A 去看账号 B 的状态,还得刷新一次账号 B 的信息?
    账号 B 比如发布了 10 个文章,每个文章都有显示这个人是不是会员的,还得每次都刷新?
    肯定不可能啊
    cncqw
    cncqw
    Nov 29, 2016
    28
    @hoythan 就想问你怎么在页面上判断一个用户是否为会员并显示出来?你不每次在渲染视图的时候判断一下吗。还肯定不可能,麻烦你自己做一遍就知道原理了。
    duguxiaohuai
    duguxiaohuai
    OP
    Nov 29, 2016
    29
    不想每天都要刷新占用内容啊 毕竟每天都需要定时查询的话还是挺麻烦的
    hoythan
    hoythan
    PRO
    Nov 29, 2016
    30
    @cncqw 重点不是判断用户是不是会员,而是判断会员过期时间更新会员的信息.
    cncqw
    cncqw
    Nov 29, 2016
    31
    @hoythan 如果不考虑性能,加一个会员到期时间字段解决一切问题,是我没说清楚还是你理解有问题?
    hoythan
    hoythan
    PRO
    Nov 29, 2016
    32
    @cncqw 不考虑性能他还问什么问题?
    cncqw
    cncqw
    Nov 29, 2016
    33
    @hoythan 求你别说了,我没时间跟你玩文字游戏,我说的是逻辑,你连基本的常识都没有就不要主动跟人讨论问题,免得自取其辱,屏蔽不谢。
    hoythan
    hoythan
    PRO
    Nov 29, 2016
    34
    @cncqw 你神经病吧?一个用户如果是会员的话会有勋章,加亮等等的数据,通过一个到期时间就能解决你这个会员是多简单?你脑路真的这么简单?是我该屏蔽你吧大神?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1654 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 23:36 · PVG 07:36 · LAX 15:36 · JFK 18:36
    ♥ Do have faith in what you're doing.