4

所以,在我的街机 howlingdoggames.com 上。我有一个积分系统,每次你访问一个有游戏的页面时都会给你一个积分。为了减少滥用,我想做一些延迟,所以它只在 45 秒后授予。这是我尝试过的:

if ($_SESSION['lastgame'] != $gameid) {
    sleep(45);
    $points = $points + $game_points;
    $_SESSION['lastgame'] = $gameid;
}

但这似乎只是让我的整个网站停止 45 秒,因为这是在 中index.php,以及我网站的许多其他代码。

无论如何我可以隔离那段代码,所以它只做声明

$points = $points + $game_points;

等待 45 秒?

4

6 回答 6

9

PHP 中(大部分)没有多线程。您可以通过 Unix 系统上的分叉进程来做到这一点,但这无关紧要,因为多线程并不是您真正想要的。你只需要这样的简单逻辑:

$now = time();
session_start();
$last = $_SESSION['lastvisit'];
if (!isset($last) || $now - $last > 45) {
    $points = $_SESSION['points'] ?? 0;
    $_SESSION['points'] = $points + 10;
    $_SESSION['lastvisit'] = $now;
}

基本上只在你最后一次给分之间的增量大于 45 秒的情况下给分。

于 2009-10-24T09:12:30.877 回答
7

这是会话阻止您的脚本。不是“PHP 中没有多线程”。sleep() 之前的 session_write_close() 将解决阻塞整个脚本的问题。但可能不适合您的问题。

所以你必须使用 js 和 AJAX 的 settimeout 来保存奖金。

来自 php.net 中 sleep() 的评论: http ://www.php.net/manual/en/function.sleep.php#96592

请注意, sleep() 会延迟当前会话的执行,而不仅仅是脚本。考虑以下示例,其中两台计算机从浏览器调用相同的脚本,除了休眠之外什么都不做。

于 2012-08-09T07:27:03.980 回答
2

不,不是直接的。您需要采取不同的方法,例如记住上次访问的时间戳,并且仅在此后经过足够的时间后才添加积分。

于 2009-10-24T08:58:35.230 回答
2

PHP 中没有多线程,所以sleep()总是会阻塞你的整个脚本。

你应该解决这个问题的方法是记录最后一场比赛的时间,如果比那晚超过45秒才奖励积分。

<?php
session_start();
if (!isset($_SESSION['last_game_time'])
    || (time() - $_SESSION['last_game_time']) > 45) {

    // code to award points here

    $_SESSION['last_game_time'] = time();
}

请记住,如果用户禁用 cookie,他们仍然可能滥用此功能(因此他们将没有会话数据)。因此,如果这真的让您担心,请在允许他们使用该功能之前检查他们是否启用了 cookie(可能有几个问题涵盖了这一点)。

于 2009-10-24T08:59:23.810 回答
1

不要阻塞脚本,而是保存会话中的当前时间,不要添加点并让页面呈现。然后在以后的页面查看中,如果您看到会话中保存的时间超过 45 秒,请添加点,将它们存储在您需要的任何位置,并清除时间。

于 2009-10-24T08:58:54.450 回答
0

您不能,但您可以将此代码设为 javascript 代码,并使用 AJAX 保存奖金。

于 2009-10-24T09:21:20.750 回答