Вопрос по delay, sleep, php – Как я могу остановить 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 секунд?
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 () задерживает выполнение текущего сеанса, а не только сценария. Рассмотрим следующий пример, где два компьютера вызывают один и тот же сценарий из браузера, который ничего не делает, кроме режима сна.
ю разветвления процессов в системах 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 секунд.
$_SESSION['last']
.
Lukáš Lalinský