1

在我正在工作的网站中,我需要添加用户点。每个用户都有自己的积分,最高积分为200。注册后用户获得100积分。随着各种任务的用户积分将被扣除。

但我正在努力解决的主要问题是如何为用户添加积分,因为每个用户每小时都需要获得 1 分,除非他有 200 分或更多积分。

我的第一个想法是做一个 cronjob,它每小时运行一个脚本,该脚本将检查用户是否已通过验证,以及用户是否少于 200 分,并为每个用户添加 1 分。

但是经过一些阅读后,我想到了我不太完全理解的不同方法。更好的方法,更少的服务器资源消耗将是运行一个函数,该函数将在用户每次登录时检查他有多少点并为他添加适当数量的点。问题是我不知道如何设置它,如果他像 8 小时一样离线,如何计算要添加到用户的点数以及如何计时?或者甚至可以使用带有计时器的ajax?

您对此有何建议和方法?

编辑:只是添加,因为你问,用户看不到对方点。

4

4 回答 4

5

当用户做某事时,请检查您上次给他们积分的时间。如果是 5 小时前,给他们 5 分。如果是 10 小时前,给他们 10 分。等等。实现缓存,因此如果用户在一小时内访问您的站点 50 次,您不必每次都检查数据库。

无论如何,简短的回答是,在加载用户数据时进行检查,而不是每隔一小时自动检查所有用户是否处于活动状态。

于 2013-10-15T13:09:41.843 回答
2
UPDATE users
SET points = MIN(points + 1, 200)

我真的没有看到这个脚本作为 cron 运行的问题。如果您将每个事件都作为事务点来处理,问题会更大,因为您必须运行以下内容:

# Generates a row each hour per uncapped user, which may become a lot
INSERT INTO transcations (points, type, created)
SELECT 1, 'HOURLY_INCOME', NOW()
FROM users
WHERE points < 200

是否与其他用户或官方/非官方统计数据有关,以检查他们当前的点是什么?这是非常相关的,因为如果它仅在登录时更新,它将无法完全工作。

于 2013-10-15T13:24:51.727 回答
0

嗯,从 mysql 5.1 开始有一个简洁的功能,基本上是 mysql cron,称为 MySQL 事件调度程序,我认为现在不适合使用它,因为 cron 脚本很容易编写,体积小而且不耗时。

我需要做的就是写

UPDATE users SET points = (points +1) WHERE points<200 

并将其添加到每小时重复出现的 mysql 事件中。

于 2013-10-15T21:13:29.987 回答
0
user_table
---------------
id  |  reg_date
1   |  2013-10-10 21:10:15
2   |  2013-10-11 05:56:32

看看用户注册后还剩多少小时,加100分:

SELECT
   TIMESTAMPDIFF(HOUR, `reg_date`, NOW())+100 AS `p`
FROM
    user_table
WHERE
    id = 1

然后检查 PHP 如果结果超过 200 只显示 200。

于 2013-10-15T13:39:49.947 回答