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

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

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

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

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

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

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

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

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

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

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

 TheHippo24 окт. 2009 г., 11:26
это кажется совершенно неуверенным ...
 e-satis24 окт. 2009 г., 13:23
Как так ? Вы все равно проверяете AJAX-вызов на сервере.

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

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

Ваш ответ на вопрос