PHP: выполнить скрипт через 5 минут после запуска первого скрипта - PullRequest
8 голосов
/ 23 января 2011

Я делаю сайт php, и я хотел бы иметь скрипт (когда вы нажимаете кнопку), который добавляет некоторую информацию в мою базу данных mysql (я могу сделать эту часть самостоятельно), и он выполняет скрипт 5 минут потом. Может быть, это не сложно, но трудно гуглить такие вещи, спасибо заранее.

Ответы [ 10 ]

6 голосов
/ 23 января 2011

Довольно сложный.Я бы пошел на что-то вроде этого:

  1. ваш оригинальный скрипт добавляет запись в базу данных, содержащую время ее выполнения,
  2. другой скрипт содержит действие, которое необходимо предпринять5 минут спустя - но запускает его только в том случае, если указанная выше запись базы данных содержит метку времени не менее 5 минут назад (надеюсь, это достаточно ясно, у меня возникли проблемы с формулировкой этого)каждые X минут (возможно, 2).

Это будет не ТОЧНО 5 минут, а скорее что-то между 5 и 7 (в случае, если вы решите запускать скрипт каждые 2 минуты).Будет ли это сделать?

6 голосов
/ 23 января 2011

Сон - ОЧЕНЬ плохая идея.Браузер клиента должен будет ждать 5 минут, чтобы завершить запрос !!!

По моему мнению, это невозможно сделать так, как вы хотите.

Вы должны создать другой скрипт, который запрашивает базу данных и проверяетесли есть новые данные (и при успешном извлечении делает работу).Этот скрипт должен запускаться cron каждые N минут.

4 голосов
/ 23 января 2011

Если вы работаете в Unix-системе:

exec("echo 'php script.php' | at now +5 minutes");

, что запланирует выполнение команды php script.php через 5 минут.

4 голосов
/ 23 января 2011

Вы можете реализовать очередь в своей базе данных, где вы добавляете «команды» для выполнения, а также сохраняете при для выполнения этой команды. Затем запустите задание cron, которое выполняется каждую минуту и ​​проверяет указанную очередь, чтобы узнать, пора ли выполнить определенную команду.

1 голос
/ 23 января 2011

Я делаю браузерную игру и хочу, чтобы, если кто-то хочет построить здание, это занимает * минуты, а затем заканчивается.

Учитывая, что это ваша реальная цельЯ рекомендую просто сохранить исходное здание с отметкой времени.

Я знаю, что вы пометили свой вопрос с помощью PHP, но я не хочу включать все накладные расходы на обработку запросов MySQL в PHP, тем более что я неЯ не знаю, как вы предпочитаете выполнять запросы или какую платформу вы используете, поэтому вот несколько псевдокодов для решения этой задачи «строительных зданий»:*

my_buildings.php

user_id = current_user['id']

completed_buildings = query('SELECT * FROM buildings b
  LEFT OUTER JOIN building_types t ON b.building_type_id = t.id
  WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) < NOW();')
under_construction = query('SELECT * FROM buildings b
  LEFT OUTER JOIN building_types t ON b.building_type_id = t.id
  WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) > NOW();')

Надеюсь, это поможет!

0 голосов
/ 23 января 2011

Я бы предложил использовать таймер в Javascript, а не в PHP.

Вставьте временную метку в $ _SESSION пользователя, чтобы указать, когда он запустил событие, и затем через пять минут перезвоните в браузер Javascript.

PHP все равно должен был бы знать время начала (чтобы пользователь не мог взломать игру путем настройки тайм-аута Javascript), но ему не нужно было бы выполнять какой-либо отсчет времени, спящий режим или что-то в этом роде. сам по себе.

0 голосов
/ 23 января 2011

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

//initial code
$pid = pcntl_fork(); //fork the process
if ($pid==0) // if in the child
{
    exec("sleep 300; php second_process.php"); //sleep for 5 minutes and execute second script
    return; // or exit
}
// rest of initial script...

«Возвращение»; важно, так как остальная часть сценария будет выполняться 2 раза (т. е. у дочернего элемента), если он не существует.

0 голосов
/ 23 января 2011

Я бы выполнил задание cron между двумя сценариями.

  1. первый скрипт устанавливает значение в таблице базы данных.
  2. задание cron выполняет второй скрипт. каждую минуту или нет.
  3. второй сценарий проверяет значение базы данных, установленное сценарием 1, чтобы решить, запускать его полностью или нет.
0 голосов
/ 23 января 2011

ИМХО лучший способ: при нажатии кнопки сохранить задание для запуска в БД с указанием времени, когда оно должно быть выполнено. Напишите небольшой демон, который каждые 10/5/2 секунды извлекает новые задания, которые должны быть выполнены, и выполняет их.

РЕДАКТИРОВАТЬ: Кстати, идея использования cron для проверки выполнения новых заданий лучше, но только если у вас небольшой веб-сайт и вам не требуется балансировка нагрузки для заданий.

0 голосов
/ 23 января 2011

Вы ищете это?

sleep php.net

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