Как я могу остановить PHP sleep (), влияющий на весь мой PHP-код? - PullRequest
2 голосов
/ 24 октября 2009

Итак, на моей аркаде, 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 ]

7 голосов
/ 24 октября 2009

В 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 секунд.

5 голосов
/ 09 августа 2012

Это сеанс блокировки вашего скрипта. not "В PHP нет многопоточности". session_write_close () перед sleep () решит заблокировать весь ваш скрипт. но может не вписаться в вашу проблему.

, поэтому вы должны были сохранить бонус, используя settimeout js и AJAX.

из комментария sleep () в php.net: http://www.php.net/manual/en/function.sleep.php#96592

Обратите внимание, что sleep () задерживает выполнение текущего сеанса, а не только сценария. Рассмотрим следующий пример, где два компьютера вызывают один и тот же сценарий из браузера, который ничего не делает, кроме режима сна.

2 голосов
/ 24 октября 2009

В 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, прежде чем разрешить им использовать эту функцию (возможно, есть несколько вопросов, которые касаются этого).

2 голосов
/ 24 октября 2009

Нет, не напрямую. Вам нужно придерживаться другого подхода, например, помнить метку времени последнего посещения и добавлять очки только после того, как с этого момента прошло достаточно времени.

1 голос
/ 24 октября 2009

Вместо того, чтобы блокировать скрипт, сохраните текущее время в сеансе, не добавляйте точки и дайте странице визуализироваться. Затем при последующих просмотрах страниц, если вы видите, что сохраненное время в сеансе старше 45 секунд, добавьте точки, сохраните их в любом месте и очистите время.

0 голосов
/ 24 октября 2009

Вы не можете, но можете сделать этот код JavaScript-кодом и сохранить бонус, используя AJAX.

...