Скажем пользователь совершил какое-то действие, сервер начинает обратный отсчет. Что-то вроде setTimeout только на сервере. По завершении отсчета нужно сделать определенное действие, если есть определенное условие (запись в базе данных). Например запустить функцию php.
php ориентирован на парадигму "как можно быстрее отдать ответ клиенту и умереть", в нем нет событийной модели.
Соответственно аналога setTimeout там нет.
Есть функция sleep но использовать её в таком ракурсе - варварство.
Если вам нужно обрабатывать какой то таймаут, правильное решение заносить эти таймауты в какую то таблицу для дальнейшей обработки, и обрабатывать истекшие задачи по крону например.
Я так понимаю, если использовать sleep, то процесс будет висеть в памяти пока этот sleep будет работать? А что с ограничением времени выполнения php-скрипта тогда?
если вы делаете sleep в php скрипте - то оно загрузит php файл и будет исполнять его sleep(N) секунд + остальное. Если вы сделаете в консоли sleep 5m && php myscript.php то оно будет отложено на 5 минут и потом загружен php файл
Чисто на сервере — добавлять задачу в cron. Выполняемый по cron'у скрипт сначала проверяет условие, на основе чего решает, продолжать выполняться или нет (ну или вызывает/не вызывает другой скрипт).
Сейчас реализовываю нечто подобное. Я делаю так:
- в хранилище пишется timestamp начала отсчета (+ мы имеем кол-во минут отсчета таймера)
- передаем на клиент сколько секунд осталось до завершения таймера по формуле timestampFromStorage - nowTimestamp
timestamp передавать на клиент бессмысленно, потому что локальное время может быть установлено любое.
Из минусов такого подхода будет то, что передача с сервера на клиент занимает какое-то время, на это время у нас будет клиент опаздывать.