Вопрос по delay, sleep, php – Как я могу остановить 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   ответов
2

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

1

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

0

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

Как так ? Вы все равно проверяете AJAX-вызов на сервере. e-satis
это кажется совершенно неуверенным ... TheHippo
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
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ý

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