Как я могу остановить 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 секунд?

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

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

Это сеанс блокирует ваш скрипт. а не «Нет многопоточности в PHP». session_write_close () до того, как sleep () решит блокировать весь ваш скрипт. но может не соответствовать вашей проблеме.

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

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

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

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

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

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

Вы не можете, но вы можете сделать этот код javascript одним и сохранить бонус с помощью AJAX.