2016-02-09 2 views
6

У меня есть веб-сайт Symfony2, который я тестирую на производстве. Я пошел вперед и очистил его кеш, потому что я сделал и, возможно, сделаю больше изменений, однако есть небольшая проблема:Обработка кеша Symfony в производстве

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

Что происходит после этого, кеш построен, но только его часть. Symfony полагает, что кеш построен полностью и работает без попытки его создания, но он работает с полуразработанным кешем. Процесс удаления немного длиннее (~ 15 секунд), поэтому в этот таймфрейм никто не должен пытаться создавать кеш, обращаясь к веб-сайту.

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

Например, одна из ошибок, которые я получаю

The directory "D:\xampp\htdocs\med-app\app\app\cache\dev/jms_diextra/metadata" does not exist. 

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

Также, как насчет разминки? Это требует времени. Что делать, если кто-то обращается к веб-сайту, пока кеш разогревается? Разве это тоже не создает конфликта?

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

EDIT Что-то интересное, что я обнаружил. Ошибка возникает, когда я удаляю папку cache/prod. Если я удалю содержимое папки без удаления самой папки, похоже, ошибка не возникает. Интересно, почему.

+0

Я предпочитаю удалять кеш с помощью 'sudo rm -rf app/cache/*', я думаю, что вы можете уменьшить время, которое потребуется много. –

+0

Как вы очищаете кеш вручную, тогда обновление также нужно делать вручную, иначе см. комментарии @johnSmith, чтобы автоматическое обновление за меньшее время или полностью отключить его. – Anil

+0

Я не могу использовать 'rm', как на Windows с xampp. –

ответ

4

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

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

+0

. Полагаю, что есть и пакет обслуживания от lexik. Вы тоже порекомендовали бы это? В любом случае, доступ к страницам обслуживания, сгенерированным этим пакетом, пытается написать или прочитать из кеша? Поскольку это все равно не решит проблемы. –

+0

У меня нет опыта с расслоением лексика. «CorleyMaintenanceBundle» имеет два режима: жесткий и мягкий. Вы ищете жесткий замок, который работает на уровне apache/nginx. Мягкая блокировка по-прежнему будет обращаться к кешу. –

3

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

Например, скажем, ваш Apache конфигурация имеет DocumentRoot всегда указует на конкретное место:

DocumentRoot /var/www/mysite/web 

Вы бы сделать этот корень символьной ссылку на вашу последнюю версию:

/var/www/mysite/web -> /var/www/versions/1.0/web 

Теперь у вас есть версии 1.1 вашего сайта для установки. Вы просто установить его /var/www/versions/1.1 - поместить код там, установить свои активы, обновить кэш и т.д. Затем просто изменить символическую ссылку:

/var/www/mysite/web -> /var/www/versions/1.1/web 

Теперь, если сайт выходит из строя ужасно вы можете просто указать символьную ссылку обратно. Преимущество здесь в том, что на вашем сайте нет простоев, и вы легко откидываетесь, если ошиблись. Чтобы автоматизировать это, я использую сценарий bash, который устанавливает новую версию и обновляет символические ссылки с помощью ряда команд, подключенных через &&, поэтому, если один шаг установки завершится с ошибкой, вся установка завершится неудачно, и вы не застряли между версией limbo.

Предоставлено, возможно, есть лучшие способы сделать все вышеизложенное или способы его автоматизации, но дело в том, что если вы меняете производство, вы хотите выполнить установку и настройку Symfony, не позволяя пользователям вмешиваться в это ,

+0

Хм, интересно, можно ли это сделать с Capifony. Разве сервер не слишком раздутый? Вам нужно скопировать все «веб-изображения» и загрузки для каждой версии. –

+0

Да, это определенно может быть проблемой. Я имею в виду, что мои сайты обычно не имеют практически никаких изображений, поэтому общая площадь на самом деле небольшая, и я не сохраняю десятки прошлых версий или что-то еще, только последние 2 или 3. Я уверен, что Capifony будет хорошим вариантом. ..deployment меньше, и я стараюсь сделать это как можно быстрее, чтобы сосредоточиться на развитии. –

Смежные вопросы