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






Сначала вам нужно зарегистрировать 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 Если вы можете поддерживать обратную совместимость миграций (по крайней мере, до вашей последней версии), то простои на обслуживание не нужны. Вы обновляете код, мигрируете, меняете местами. Иногда для этого требуется разделить миграцию на несколько частей, что занимает больше времени (простое переименование столбца занимает 3 шага; создать новый столбец, перенести данные, удалить старый). Мы могли развертывать / обновлять приложения без простоев в течение нескольких лет.
Спасибо, я могу сделать это с помощью своего веб-хостинга. Искал более прозрачный способ ... Но, возможно, это невозможно.