我怎样才能阻止PHP睡眠()影响我整个的PHP代码?(How can I stop PHP slee

2019-08-31 23:01发布

所以,在我商场,howlingdoggames.com。 我有一个点系统,让你每次你在,现在,以减少这种滥用浏览的网页游戏的时间点,我想提出某种延迟,因此它只有45秒后颁发。 下面是我试过。

...

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

   ...

不过,这似乎只是阻止我的整个网站45秒,因为这是在index.php文件,与其他代码,以我的网站很多。

反正我有可以隔离的代码位,所以它才有的功能

$points = $points + $game_points;

等待45秒?

Answer 1:

有(大部分)在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秒以上。



Answer 2:

这是会议挡住你的脚本。 不是“有PHP中没有多线程”。 session_write_close()睡觉前()将解决阻止你的整个脚本。 但可能不适合您的问题。

所以你必须保存使用的JS和AJAX的setTimeout奖金。

从php.net睡眠()的评论: http://www.php.net/manual/en/function.sleep.php#96592

注意睡眠()延迟执行当前会话,而不仅仅是脚本。 考虑下面的示例,其中两台计算机通过浏览器,它不会做任何事情,但睡眠调用相同的脚本。



Answer 3:

不,不是直接。 你需要采取不同的方法,像记住上次访问的时间戳且仅当自认为足够的时间量已经过去了加分。



Answer 4:

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(有可能是覆盖这几个问题)。



Answer 5:

而不是阻塞的脚本,保存当前时间在会话中,不加分,让网页渲染。 然后在后页面访问量,如果你看到,在会议上保存的时间是年龄超过45秒,加点,它们存储你需要的地方,并清除时间。



Answer 6:

你不能,但你可以使此代码一个javascript之一,并使用AJAX保存的奖金。



文章来源: How can I stop PHP sleep() affecting my whole PHP code?
标签: php sleep delay