不在线时执行任务和计时(请不要使用 cron 作业)(简单)


Perform task when not online & timing (No cron jobs please) (Simple)

>我有以下代码

  $timeNow = time();
    $timeExpire = $timeNow - 15;
    $con->query("UPDATE players SET Time='".$timeNow."', TimeExpire='".$timeExpire."' WHERE Username='". $_SESSION['Username']."'");
    $User = $con->query("SELECT * FROM players WHERE Username='".$_SESSION['Username']."'");
    $UserInfo = $User->fetch_object();
    if($UserInfo->Wood == "") {
    $con->query("UPDATE players SET Wood='0'");
    } elseif($UserInfo->Stone == "") {
    $con->query("UPDATE players SET Stone='0'");
    } elseif($UserInfo->Gold == "") {
    $con->query("UPDATE players SET Gold='0'");
    }
    if((time() - 15) >= $UserInfo->TimeExpire) {
    $getAmount = (time() - $UserInfo->TimeExpire);
    $con->query("UPDATE players SET Wood=Wood+$getAmount, Stone=Stone+$getAmount, Gold=Gold+$getAmount WHERE Username='". $_SESSION['Username']."'");

}

我有几个问题:

  • 我怎样才能使用户只能接收木材,石头和每 10 秒镀金一次(否则他们可以刷新页面)

  • 如何计算有多少次过期?例如,如果他们注销 2 小时,然后重新登录,他们得到
    如果他们在线 2 小时会得到的钱

您不一定需要这些查询一直执行。只需在玩家表中创建一个列来记录他们上次获得资源的时间,如下所示:

ALTER TABLE players ADD LastTimeReceivedResources INT(5)

当用户加载页面时,请检查此字段以查看他们未获得资源的时间:

$wood_per_10_seconds = 15;
$last_time_received_resources = ...; // Get from players table
$time_now = time();
$added_wood = floor(($time_now-$last_time_received_resources)/10) * $wood_per_10_seconds;
$con->query("UPDATE players SET Wood=Wood+$added_wood WHERE Username='".$_SESSION['Username']."'");

在此之后,您将当前时间保存到"上次时间接收资源"字段中:

if ($added_wood>0) $con->query("UPDATE players SET LastTimeReceivedResources=$time_now WHERE Username='".$_SESSION['Username']."'");

保存上次完成刷新的时间。检索上次刷新,计算自那时以来的秒数。

$date = new DateTime( '2013-09-10 18:07:13' );
$date2 = new DateTime( '2013-09-11 18:11:08' );
$diff = $date2->getTimestamp() - $date->getTimestamp();

虽然我个人确实认为一个好的老式全球 cron 将是要走的路。