Как заставить все браузеры пользователя обновляться для обновления программного обеспечения - PullRequest
1 голос
/ 25 мая 2019

У меня есть несколько веб-приложений, которые работают изо дня в день для ряда предприятий.

Приложения на PHP / MySQL / JS, работающие на удаленном сервере Apache.

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

Я бы хотел иметь возможность обновлять программное обеспечение в рабочее время, если это возможно.

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

У меня есть таймер обновления в JS, который запускает обновление браузера в 11:59. Это произойдет, если браузер все еще открыт.

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

Я обдумал несколько способов сделать это, включая cron и значения базы данных, которые можно прочитать и сбросить, но:

Интересно, удалось ли кому-нибудь добиться этого?

Ответы [ 3 ]

4 голосов
/ 04 июня 2019

Вы хотите обновить все открытые вкладки браузера, которые указывают на ваши приложения xAMP.Несколько вопросов:

  1. Требуется ли немедленное обновление или его можно отложить?то есть нужно ли обновлять все вкладки одновременно, независимо от взаимодействия с пользователем;или приемлемо дождаться следующего запроса от каждого клиента, когда бы он ни был?

  2. Можете ли вы запланировать обновление заранее (скажем, по крайней мере с 1 интервалом ожидания сеанса)время подготовки), или вам нужен метод, который запускает обновления немедленно?

Если вам требуется немедленное обновление без предварительного планирования, вам не повезло.Единственный способ сделать это - сохранить открытый канал для асинхронных обновлений от сервера к клиентам, что трудно сделать с простым Apache / PHP (см. комета , websockets ),

Если вы можете справиться с отложенным обновлением (ожидая, пока пользователь не отправит запрос), у вас есть несколько вариантов.Например, вы можете

  • завершить все сеансы (вызвав скрипт, который удаляет все соответствующие файлы сеансов на стороне сервера; найден в /var/lib/php/sessions/ в linux).Обратите внимание, что ваши пользователи не оценят потерю, скажем, содержимого их корзины покупок.
  • использует JavaScript для проверки значения version на стороне клиента (загружается во время входа в систему и хранится в localStorage или подобном) от входящих ответов от сервера (который будет загружать его из файла конфигурации или запроса БД).Если значение на стороне сервера изменилось, сохраните все, что может быть сохранено в localStorage (чтобы избежать предыдущего сценария), сообщите пользователю и обновите страницу.

В качестве альтернативы, если вы можете запланировать обновленияс достаточным предварительным предупреждением вы можете включить в ответы сервера инструкции, которые при необходимости вызовут механизм обновления.Например, такие ответы могут изменить ваш текущий код «сброса в 11:59:59», чтобы он читался как «сброс в $ запрашиваемой_реализации_времени».

0 голосов
/ 05 июня 2019

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

Тем не менее, я знаю из работы с сервисом флагов запуска Launch Darkly, что это можно сделать. К сожалению, я не понимаю всю внутреннюю работу, но я понимаю, что служба использует наблюдаемые для отслеживания обновлений. Наблюдаемые похожи на обещания, за исключением того, что они постоянно следят за новыми изменениями в своей цели. После этого вы можете принудительно перезагрузить страницу (или, возможно, предупредить пользователя, запрашивая ее) при обновлении цели.

0 голосов
/ 05 июня 2019

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

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

После получения этого заголовка браузер пользователя автоматически загрузит свежий контент. И вы можете включить / выключить вышеуказанные строки в соответствии с вашими потребностями. Это может быть не самый сложный способ достижения желаемой функциональности, но стоит попробовать.

...