Symfony: очистить кеш и прогреть, когда пользователи используют веб-сайт

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

Моя проблема заключается в том, что пользователи работают на веб-сайте, и я хотел бы обновить файл, для которого требуется команда разминки Symfony: команда не выполняется, если пользователь одновременно просматривает кеш, просматривая веб-сайт. Затем кеш поврежден, и мне нужно снова запустить очистку кеша и команду разогрева, когда пользователи злятся, потому что веб-сайт не работает, и снова и снова нажимать кнопку F5, делая этот процесс бесконечным ...

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

Но просто исправить опечатку - сложная задача, не так ли?

Есть ли способ очистить и прогреть один файл? Или есть идея правильно справиться с этим процессом?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
743
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сначала вам нужно зарегистрировать EventListener:

# /config/services.yaml
parameters:

    lockFilePath: "%kernel.root_dir%/../web/.lock"    

services:

    maintenance_listener:
        class: App\EventListener\MaintenanceListener
        arguments:
            - "%lockFilePath%"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Затем сам EventListener:

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class MaintenanceListener
{
    private $lockFilePath;

    public function __construct($lockFilePath)
    {
        $this->lockFilePath = $lockFilePath;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ( ! file_exists($this->lockFilePath)) {
            return;
        }

        $event->setResponse(
          new Response(
            'site is in maintenance mode',
            Response::HTTP_SERVICE_UNAVAILABLE
          )
        );
        $event->stopPropagation();
    }
}

Итак, если вы теперь создаете файл .lock в / web, значит, ваш сайт находится в режиме обслуживания. Если вы хотите отобразить специальный шаблон, вы можете вставить @templating в EventListener.

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

sdespont 04.04.2018 17:07

Не уверен, что это действительно решит проблему перестроения кеша при поступлении запроса. Сомнительно, будет ли вызван слушатель, если приложение никогда не запускается.

Cerad 04.04.2018 18:10
Ответ принят как подходящий

Работает для меня, может сработать для вас.

Обычно у меня есть две версии моего приложения, расположенные рядом. Только один подключен к веб-серверу. Если мне нужно внести какие-либо изменения, я обновляю неактивную версию, очищаю кеш, кеш прогрева и т.д. Затем я переключаю активную версию на веб-сервере.

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

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

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

sdespont 05.04.2018 08:33

@sdespont Если вы можете поддерживать обратную совместимость миграций (по крайней мере, до вашей последней версии), то простои на обслуживание не нужны. Вы обновляете код, мигрируете, меняете местами. Иногда для этого требуется разделить миграцию на несколько частей, что занимает больше времени (простое переименование столбца занимает 3 шага; создать новый столбец, перенести данные, удалить старый). Мы могли развертывать / обновлять приложения без простоев в течение нескольких лет.

mleko 05.04.2018 08:47

Другие вопросы по теме