Вопрос по sleep, php, delay – Как я могу остановить PHP sleep (), влияющий на весь мой PHP-код?

2

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

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

7

ю разветвления процессов в системах 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 секунд.

@Lukas: спасибо за указание на это. Исправлена. cletus
Странно случайное понижение на этом. Просто любопытно, была ли причина или это была неудачная попытка тактического понижения? cletus
Это не былот, но пример кода неНа самом деле это не ответ на вопрос, так как это должно произойти только после посещения новой игры + у вас есть опечатка.$_SESSION['last'] Lukáš Lalinský
0

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

это кажется совершенно неуверенным ... TheHippo
Как так ? Вы все равно проверяете AJAX-вызов на сервере. e-satis
2

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

2

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

5

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

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

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

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

Кто-нибудь знает, правда ли то, что говорится в этом комментарии? Это было довольно отрицательно vivoconunxino

Похожие вопросы