如何阻止PHP sleep()影响我的整个PHP代码?

时间:2009-10-24 08:53:06

标签: php sleep delay

所以,在我的街机上,howlingdoggames.com。我有一个积分系统,每次你访问一个有游戏的页面时都给你一个点,现在,为了减少对此的滥用,我想做出某种延迟,所以它只在45秒后获奖。这是我尝试过的。

...

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

   ...

但是,这似乎只是暂停了整个网站45秒,因为这是在index.php文件中,就像我网站的其他代码一样。

无论如何,我可以隔离那段代码,所以它只能生成函数

$points = $points + $game_points;

等待45秒?

6 个答案:

答案 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保存奖金。