Символы 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 / релизы / 20130826172641

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

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

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

  • Есть ли способ имитировать поведение symlink с конфигурацией apache?
  • Случай против использования символов для продвижения кода

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

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

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

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