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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 17 августа 2011

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

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

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

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

1 голос
/ 11 августа 2014

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;
}
1 голос
/ 17 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...