所以,在我的街机上,howlingdoggames.com。我有一个积分系统,每次你访问一个有游戏的页面时都给你一个点,现在,为了减少对此的滥用,我想做出某种延迟,所以它只在45秒后获奖。这是我尝试过的。
...
if ($_SESSION['lastgame'] != $gameid);{
sleep(45);
$points = $points + $game_points;
$_SESSION['lastgame'] = $gameid;
}
...
但是,这似乎只是暂停了整个网站45秒,因为这是在index.php文件中,就像我网站的其他代码一样。
无论如何,我可以隔离那段代码,所以它只能生成函数
$points = $points + $game_points;
等待45秒?
答案 0 :(得分:7)
PHP中(大多数情况下)没有多线程。您可以使用Unix系统上的分叉进程来执行此操作,但这是无关紧要的,因为多线程并不是您所追求的。你只想要这样简单的逻辑:
$now = time();
session_start();
$last = $_SESSION['lastvisit'];
if (!isset($last) || $now - $last > 45) {
$points = $_SESSION['points'];
if (!isset($points)) {
$points = 0;
}
$_SESSION['points'] = $points + 10;
$_SESSION['lastvisit'] = $now;
}
基本上只有在上次给出分数之间的增量大于45秒时才给出分数。
答案 1 :(得分:5)
会话阻止你的脚本。不是“PHP中没有多线程”。 sleep()之前的session_write_close()将解决阻塞整个脚本的问题。但可能不适合你的问题。
所以你必须使用js和AJAX的settimeout保存奖金。
来自php.net中sleep()的评论: http://www.php.net/manual/en/function.sleep.php#96592
请注意,sleep()会延迟当前会话的执行,而不仅仅是脚本。请考虑以下示例,其中两台计算机从浏览器调用相同的脚本,除了休眠之外不执行任何操作。
答案 2 :(得分:2)
不,不是直接的。您需要采取不同的方法,例如记住上次访问的时间戳,并且只有在经过足够的时间后才添加点。
答案 3 :(得分: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(可能有几个问题可以解决此问题)。
答案 4 :(得分:1)
不是阻止脚本,而是在会话中保存当前时间,不要添加点并让页面呈现。然后在以后的页面视图中,如果您看到会话中保存的时间超过45秒,请添加点,将它们存储在您需要的任何位置,并清除时间。
答案 5 :(得分:0)
您不能,但您可以将此代码设为javascript,并使用AJAX保存奖金。