Выполнить script на сервере по действию пользователя

Я действительно не знал, как описать свою проблему в названии, поэтому я сделал все возможное.

У меня есть функция, которая reset мой сайт. У меня также есть отметка времени, в которой эта функция должна выполняться. метка времени меняет каждый reset, поэтому мне нужно найти способ активировать эту функцию в que.

Моя лучшая душа до сих пор заключалась в том, чтобы написать функцию time_to_reset(), и если она верна, запустите script, но script тяжелый, и я боюсь, что это не удастся запустить его на случайном пользователе (reset происходит только один раз). Он мог выйти из веб-сайта до выполнения script полностью. Кроме того, я боюсь, что в некоторых ситуациях script будет выполняться дважды или более из-за нескольких пользователей, регистрирующихся в togather. это еще одна проблема, я буду рад помочь решить проблему.

Прошу прощения за мой плохой английский, и ни для кого не вопрос... Я тоже это ненавижу...

Я с радостью объясню, если вы меня не поняли. Спасибо!

EDIT: Мне не нужно использовать пользователей, это была только идея. У меня есть панель администратора, написанная на PHP-коде, в которой вы можете редактировать дату времени для reset. Есть способ изменить даты CJ с помощью php-кода? или любой другой способ сделать reset произойти без использования пользователей?

Ответ 1

Действия в очереди для работы с загрузкой страниц довольно просты. Просто создайте таблицу, в которой содержится действие (script/function), и когда он должен быть запущен. Затем вы можете выполнить следующее действие, и если это время для выполнения, просто удалите строку, таким образом ваш script может работать, и никто другой не инициирует действие. Если у вас есть только одно действие, вы можете просто хранить таблицу только время ее запуска.

В ответ на вашу озабоченность по поводу того, что script является тяжелым, скрипты, запущенные с установленными интервалами, действительно являются тем, что был изобретен cron, и для более тяжелых действий на PHP-сайте это действительно лучший вариант. Если вы используете VPS, у вас уже есть cron, просто SSH на свой сервер и запустите crontab -e, чтобы отредактировать файл crontab и введите что-то вроде:

*/5 * * * * php /path/to/script.php

для запуска script каждые 5 минут. (Здесь больше примеров cron: http://www.thegeekstuff.com/2011/07/cron-every-5-minutes/)

В качестве альтернативы, если вы не можете настроить задания cron на своем сервере, вы можете сделать свое действие reset на своей собственной странице и использовать службу webcron, например http://www.mywebcron.com/ для вызова этой страницы с установленными интервалами.

Ответ 2

Вы уже знаете, в чем проблема.

Он мог выйти из веб-сайта до выполнения script полностью

Два решения этой проблемы. В принципе, вы не хотите зависеть от браузера для выполнения.

Кроме того, я боюсь, что в некоторых ситуациях script будет выполняться дважды или больше из-за того, что несколько пользователей регистрируются в togather

Поместите некоторую систему блокировки. Не выполняйте script, если она уже запущена, достойным способом было бы создать запись базы данных или просто файл сразу после запуска script. Итак, в следующий раз, когда ваша функция будет выполнена, вы можете проверить status, если она уже запущена.


Обновить в соответствии с цепочкой в ​​комментариях

Вы можете touch указать файл script.lock, когда script выполняется в первый раз. Кроме того, перед выполнением script проверьте file_exists и проверьте измененное время stat

$stat = stat('script.lock'); 
$mtime = $stat['mtime'];

Разрешить script выполнять только в том случае, если файл отсутствует и определенное время прошло.

Удалите файл, когда выполнение завершено.

Ответ 3

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

Блокировка выполняется после создания всей пользовательской страницы и установки PHP-кода, чтобы он не прерывался, если пользователь покидает страницу.

Это позволит вам сделать несколько вещей:

  • Убедитесь, что проверка всех страниц загружена, чтобы проверить, является ли запись в одной строке reset претензией/заявлена. Если да, сообщите, что сайт будет reset, несмотря на то, что осталось много времени (блокировка PHP должна управлять этим периодом задержки).
  • Отключите блокирующий PHP, чтобы он мог продолжать работать. Обязательно установите время выполнения достаточно высоким, чтобы он мог выполнить всю задачу.
  • Как часть reset или перезагрузка или что бы это ни случилось, отмените блокировку reset и установите следующую дату reset в будущем, когда это необходимо.

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

Ответ 4

Су, я думаю, что главный ответ уже сделан. Вы просто говорите, что ваш код тяжелый, и вы боитесь получить ненужные сбрасывания TimeStamp? Правильно. soo, если это ваша проблема, вы можете просто исправить его, наложив на пользователя, который регистрирует Cookie с меткой времени и идентификатором пользователя. Зашифровано (я нормально шифрую пароль и добавляю зашифрованный пароль в cookie soo, становится невозможным пользователь, чтобы изменить идентификатор файла cookie и узнать другого пользователя. Зашифрованный пароль), но это не так.

Реальное исправление: Вам просто нужно иметь таблицу в базе данных и добавить идентификатор пользователя и временную метку этого пользователя, когда он войдет в систему, вы можете проверить временную метку, если вы хотите выполнить сценарии действия пользователя, если это то, что вам действительно нужно, вы необходимо сделать 1 php файл с действиями и токеном в примере GET:

?

actions.php маркер = 231sfa231dasdasd & действие = Имя пользователя

На странице появится пустая страница с именем пользователя только текущего пользователя. Вы можете сделать это интерактивным, добавив некоторый код JavaScript и заново обновить его, когда он изменится.

Не уверен, помог ли я тебе, но если я скажу. Благодаря

Ответ 5

Кажется, использование CronJob - ваше лучшее решение

Создайте ли новую страницу PHP, как запускать "reset", и что запускает ее, вы также можете использовать Mysql для сохранения очереди очередей, и вы можете обрабатывать сбрасывания на каждую очередь.

Привет

Ответ 6

Я бы предложил использовать ignore_user_abort в вашем script.

ignore_user_abort()

Устанавливает, будет ли отсоединение клиента прерывать script.

При запуске PHP в качестве командной строки script и script tty уходит без завершения script, тогда script умрет при следующем попытке написать что-либо, если значение не установлено на ИСТИНА

Для полного описания этой функции я хотел бы обратиться к PHP Manual