Выполнение запланированных заданий - PullRequest
0 голосов
/ 06 февраля 2011

Я хочу вызвать функцию ровно через 30 минут после того, как пользователь отправит форму.Я использовал функцию javascript setTimeOut (), но она очищает таймер при обновлении страницы или закрытии браузера.Независимо от того, что (независимо от того, был ли браузер закрыт или обновлен), я хочу вызвать функцию ровно через 30 минут, а также отобразить оставшееся время до 30 минут.заданий, но я понимаю, что PHP не может напрямую вызывать задание cron.

Может кто-нибудь сказать мне, что будет лучшим подходом для этого ??

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011
  1. Команда at и связанный демон atd могут планировать выполнение вещей в произвольное время в будущем.Скорее всего, вам придется написать специальный php-скрипт для передачи на at.Вы можете передать ему дополнительные аргументы, чтобы узнать, какой пользователь отправил форму и т. Д. Этот код, конечно, будет выполняться на сервере.Код PHP будет хранить результаты в базе данных (или аналогичном глобальном хранилище данных).
  2. Чтобы отобразить, сколько времени осталось бы пользователю, я бы сохранил время в сеансе или базе данных.Помните, что время на сервере будет отличаться от времени на компьютере пользователя, поэтому лучше всего выполнять вычисления различий на сервере, а не в JavaScript.
  3. A setTimeout() вызов по-прежнему может использоваться для обеспечениябраузер перенаправляется на страницу (или загружается через AJAX и т. д.) для просмотра результатов в соответствующее время (при условии, что пользователь находится на вашем сайте, когда происходит событие).Продолжайте вызывать setTimeout() при каждой загрузке страницы с правильным временем, основанным на времени в сеансе.

Имейте в виду, что для выполнения кода PHP на шаге # 1 потребуется время, и такпоэтому вы можете добавить небольшую задержку к # 3, чтобы убедиться, что результаты доступны, а также надлежащую обработку ошибок, если результаты будут недоступны по другим причинам.

2 голосов
/ 06 февраля 2011

Я проголосовал за метод @wuputah и согласен с тем, что он лучше, но если вы не можете получить доступ к шагу № 1 его (на виртуальном хостинге и т. Д.), Вы можете установить метку времени в базе данных и настроить задание cron. запускать каждую 1 минуту, которая проверяет базу данных на «истекшее» время без флага «обработано» ... и затем выполняет вашу процедуру для этих данных (и помечает запись в БД как «обработанную», чтобы она не выполнялась в следующий раз цикл).

+---------------------------------------------+
| RECORD ID | TIMESTAMP           | PROCESSED |
+---------------------------------------------+
|   1       | 2010-02-06 15:27:10 | yes       |
|   2       | 2010-02-06 15:47:10 | no        |
|   3       | 2010-02-06 15:49:10 | no        |
+---------------------------------------------+
...