Символы Capistrano, которые кэшируются?

Я настраивал PHP-развертывания с Capistrano на CentOS 6 и столкнулся с интересной проблемой. Как работает capistrano, он устанавливает папки следующим образом:

  • /var/www/myapp.com/
    • текущий (символическая ссылка на последний выпуск в / релизы)
    • общий
    • релизы
      • 20130826172737
      • 20130826172114

Когда я смотрю на "текущую" символическую ссылку, она указывает на самый последний выпуск. Сначала при открытии моего веб-приложения все работало нормально. После развертывания нового выпуска текущая папка правильно указывает на новый выпуск, но веб-приложение пытается загрузить файлы из старого выпуска (который был удален в процессе очистки Capistrano). Кроме того, виртуальный хост настроен так, чтобы указывать на /var/www/myapp.com/current/Public.

Символьные ссылки кешируются каким-либо образом?

Конкретный код PHP, который терпит неудачу (который инициализирует мою структуру), таков:

require_once dirname(dirname(__FILE__)) . '/App/App.php';
App\App::run();

Это находится в index.php в настоящее время находится в /var/www/app.com/current/Public/index.php.

Мои журналы ошибок Apache показывают:

Неустранимая ошибка PHP: require_once(): не удалось открыть обязательный файл '/var/www/myapp.com/releases/20130826172237/App/App.php' (include_path='.:/ Usr/share/pear:/usr/share/php') в /var/www/myapp.com/releases/20130826172237/Public/index.php

И текущая символическая ссылка показывает:

текущий -> /var/www/zverse/ Releases/20130826172641

Очевидно, 20130826172641!= 20130826172237, который был предыдущей версией.

Любые идеи или области, которые я могу посмотреть?

2 ответа

Решение

Я не могу проверить это, но кажется, что есть некоторое непредсказуемое поведение с Apache, следящим / кэширующим старое местоположение символических ссылок:

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

Он предлагает переместить весь каталог вместо обновления символической ссылки.

Вы проверили директивы realpath_cache_size и realpath_cache_ttl? По умолчанию php > 5.1 кэширует реальные пути к символическим файлам в течение 120 секунд. Это вызовет проблемы с развертыванием Capistrano. Основными проблемами являются кеширование - даже если вы очистите кеш, ваши старые php-файлы будут обслуживаться в течение двух минут, заполняя их старыми данными - и взаимодействие между php и статическими файлами. Статические файлы обслуживаются непосредственно Apache, поэтому будут обновлены немедленно. Тем не менее, php-код останется в предыдущей версии в течение двух минут после развертывания, поэтому он будет ожидать старых версий любых измененных статических файлов. Это особенно проблема, если вы используете процедуру взлома кеша, которая изменяет имена этих файлов; в этом случае php-код вообще не сможет найти ожидаемые файлы.

Во всяком случае, есть два решения. Первый - установить для realpath_cache_size значение 0 в php.ini. (Примечание: установка для realpath_cache_ttl значения 0 не отключает кэш.) Или, если вы хотите оставить его включенным, вы сможете использовать функцию clearstatcache для очистки кэша realpath сразу после развертывания символической ссылки, используя ловушку capistrano. Однако следует помнить, что если вы используете mod_php, среды выполнения php cli и apache разделены, поэтому вам нужно будет вызывать эту функцию, используя скрипт php, вызываемый apache, аналогично тому, что здесь делается для очистки кэша APC. Хотя я этого не проверял, так как не заметил значительного снижения производительности от простого отключения кеша.

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