PHP游戏离线收益采用“登录时动态结算”为主、crontab兜底为辅的策略:数据库仅存last_active_time时间戳,用户登录时按时间差与产出率计算金币/经验并更新数据,避免冗余字段和一致性问题。

PHP游戏网站的离线收益(比如挂机金币、经验、资源自动增长)通常靠定时任务实现,核心思路是:在用户下次登录或访问时,根据上次在线时间与当前时间差,按规则补发收益,而不是真正在后台每秒计算——那样服务器压力太大且不必要。
用数据库记录关键时间点
每个用户表里加几个字段:
- last_login_time:用户上一次登录(或活跃)的时间戳
- offline_gold、offline_exp 等:已累计但未领取的离线收益(可选,也可实时计算)
- 或者只存 last_active_time,每次登录时再动态算
推荐只存时间戳,避免冗余数据和一致性问题。收益逻辑写在登录/刷新接口里,轻量又可控。
登录时自动结算离线收益
用户请求登录或进入主界面时,后端 PHP 做如下处理:
立即学习“PHP免费学习笔记(深入)”;
- 读取该用户的 last_active_time
- 计算时间差:
$diffSec = time() - $lastActive; - 按每分钟/每小时产出率换算收益,例如:
每 60 秒 +10 金币 →$goldAdd = floor($diffSec / 60) * 10; - 更新用户金币、设置新的 last_active_time = time(),并保存
- 把
$goldAdd返回给前端提示“您离线期间获得 XXX 金币”
用 Linux crontab 做兜底或辅助任务
某些场景需要真正后台运行,比如:
- 清理长期未登录账号的离线收益(防溢出)
- 全服广播“离线奖励翻倍”活动开始/结束
- 每天凌晨重置部分离线上限(如每日最多领 2 小时收益)
写一个 PHP 脚本 /path/to/cron_offline.php,用 CLI 模式运行:
php /path/to/cron_offline.php
然后添加到系统定时任务(如每天执行一次):
0 0 * * * /usr/bin/php /path/to/cron_offline.php > /dev/null 2>&1
注意几个实际细节
- 别用 session 或内存缓存 last_active_time:进程重启就丢,必须落库
-
防止重复领取:更新
last_active_time和金币要放在同一个事务里 - 限制最大离线时长:比如最多按 24 小时结算,避免用户卸载半年后回来爆金币
- 考虑时区:统一用 UTC 存储时间戳,展示时再转本地时间



















