Можно ли планировать запуск PHP-скрипта в определенное время или по истечении определенного времени?

Я пишу социальную игру облака для Android и использую PHP на сервере. Почти все аспекты игры будут управляться пользователем или пользователем, поэтому большую часть времени устройство отправляет запрос на сервер, а сервер, в свою очередь, отправляет ответ на устройство. Иногда сервер также отправляет push-сообщения на устройства, но обычно отвечает на одно устройство пользователя, связанное с сервером.

Однако существует один особый случай, когда пользователь может установить «таймер», и по истечении заданного времени серверу необходимо отправить push-сообщения всем устройствам. Один из способов сделать это – сохранить таймер локально на устройстве пользователя и, как только он погаснет, отправить сигнал на сервер для отправки push-сообщений. Однако было несколько причин, по которым я не хотел этого делать. Например, если пользователь решает не играть больше или проигрывает игру, таймер должен технически оставаться в игре.

Я огляделся вокруг метода на PHP, который позволил бы мне сделать что-то подобное, но все, что я придумал, это сигналы тревоги, которые мне не нужны. Я также думал о работе cron и, действительно, они были рекомендованы для подобных ситуаций на этом и других форумах, но поскольку это не повторяющееся событие, а скорее одноразовое событие, которое должно состояться в произвольный момент времени, я не знал, что работа cron – это то, что я хочу.

Мое текущее лучшее решение включает в себя задание cron, которое выполняется один раз в секунду, и проверяет, будет ли одно из этих событий происходить в следующую секунду, и, если это так, отправляет push-сообщения. Это правильный способ справиться с этой ситуацией или есть лучший инструмент, который я еще не нашел?

cron отлично подходит для сценариев, запущенных на регулярной основе, но если вы хотите, чтобы одноразовый (или двухзадачный) скрипт запускался в определенное время, вы использовали команду unix 'at', и вы можете делать это напрямую с php используя следующий код:

 /**** * Schedule a command using the AT command * * To do this you need to ensure that the www-data user is allowed to * use the 'at' command - check this in /etc/at.deny * * * EXAMPLE USAGE :: * * scriptat( '/usr/bin/command-to-execute', 'time-to-run'); * The time-to-run shoud be in this format: strftime("%Y%m%d%H%M", $unixtime) * **/ function scriptat( $cmd = null, $time = null ) { // Both parameters are required if (!$cmd) { error_log("******* ScriptAt: cmd not specified"); return false; } if (!$time) { error_log("******* ScriptAt: time not specified"); return false; } // We need to locate php (executable) if (!file_exists("/usr/bin/php")) { error_log("~ ScriptAt: Could not locate /usr/bin/php"); return false; } $fullcmd = "/usr/bin/php -f $cmd"; $r = popen("/usr/bin/at $time", "w"); if (!$r) { error_log("~ ScriptAt: unable to open pipe for AT command"); return false; } fwrite($r, $fullcmd); pclose($r); error_log("~ ScriptAt: cmd=${cmd} time=${time}"); return true; } 

soloution 1: ваш php-файл может содержать конечный цикл

 $con = true; while($con) { //do sample operation if($end) $con = false; else sleep(5); // 5 seconds for example } в $con = true; while($con) { //do sample operation if($end) $con = false; else sleep(5); // 5 seconds for example } 

soloution 2: использование заданий cron. Зависит от yout CP, вы можете следовать инструкциям и вызывать свою php-программу в определенное время
limit: в задании cron минимальное время между двумя вызовами – 1 минута
soloution 3: используйте скрипт оболочки и вызовите свою php-программу, когда захотите

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

Единственный другой вариант, о котором я знаю, это Cron . Как говорит @Pete, вы можете управлять заданиями Cron из PHP, например:
http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/

Это будет связано с честным кодированием, но я думаю, что это ваши лучшие варианты.

Другой вариант заключается в том, чтобы браузер вашего пользователя вызывал функцию PHP с использованием запроса Ajax и setTimeout JavaScript, как это было предложено принятым ответом в этом вопросе:
как вызвать функцию в PHP через 10 секунд загрузки страницы (не используя HTML)