Выполнить 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