У меня есть этот скрипт, который выполняет запрос к базе данных через 2 минуты после загрузки страницы. Я не могу использовать спать() функция, потому что она просто не позволяет странице загружаться правильно.
Я нашел этот кусок кода:
$now = time();
while ($now + 120 > time()) {
// do nothing
}
//other actions here
но он просто не загружает страницу. Как я могу это сделать? Заранее спасибо!
РЕДАКТИРОВАТЬ: Я хочу наградить пользователя после просмотра видео в течение двух минут. Если пользователь закрывает страницу раньше времени, ничего не будет выполнено.
Если вам нужны результаты запроса, возвращаемые на страницу, почему бы не сделать асинхронный вызов. Дайте странице загрузиться, подождите две минуты в javascript, затем используйте ajax, чтобы поразить ваш php-сервер и получить результаты запроса.
использование setTimeout
https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout
Затем сделайте запрос Ajax с
http://api.jquery.com/jquery.ajax/
Или же
https://developer.mozilla.org/en-US/docs/AJAX
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
Также в зависимости от вашего приложения и того, что запрос, рассмотрите возможность кэширования результатов запроса в следующий раз. Однако это зависит от того, что делает ваше приложение.
Если вам не нужны результаты запроса на вашей странице, см. Запускать задачу PHP асинхронно
Правильный способ реализовать это с использованием только серверной стороны, учитывая контекст вашего нового редактирования, состоит в том, чтобы использовать службу потокового видео, которая при успешной потоковой передаче всего видео (без предварительного удаления пользователя или приостановки) запускает почтовую операцию скрипт, который кредитует пользователя. Однако это более сложная настройка, чем другие предложенные методы, если вы не знакомы с сервисами потокового видео. Я хотел бы рассказать об использовании реализации, которую вы находите простой и удобной, учитывая ваши потребности в безопасности, затраты, последствия хакерских атак.
Создайте скрипт PHP, который обновит кредиты пользователя. Запланируйте выполнение этого скрипта, например, каждую 1 минуту, используя Cron.
Этот скрипт проходит через всех активных пользователей и обновляет кредиты каждого пользователя. Тогда это заканчивается.
Условия, когда он должен обновить кредиты, зависит от вас. Я полагаю, вы проверите, прошло ли 2 минуты с какого-либо предыдущего занятия, и если да, вы обновите кредиты. В противном случае вы ничего не будете делать.
Это может выглядеть так:
$users = getActiveUsers();
$currentTime = time();
// go through all active users
foreach ($users as $user) {
// if conditions are met, give some credits to the user
if ($currentTime - $user->lastActivityOn >= 120) {
$user->credit += 1;
$user->save();
}
}
Этот сценарий будет выполняться очень мало времени, в зависимости от количества пользователей, он может длиться от нескольких миллисекунд до нескольких секунд и будет выполняться каждую минуту.
Это очень просто, и это распространенный способ реализации подобных задач.
Это не должно быть реализовано на клиенте, потому что вы не можете доверять клиенту. Вы бы потратили много усилий для реализации различных проверок и механизмов безопасности, и они, скорее всего, не будут на 100% защищены. На другой стороне решение на стороне сервера полностью защищено без каких-либо усилий.
Вы можете использовать usleep-функцию в php
подождите 2 секунды
USleep (20000);
http://php.net/manual/en/function.usleep.php
время в микросекундах