Я настраивал развертывание PHP с Capistrano на CentOS 6 и столкнулся с интересной проблемой. Как работает capistrano, он устанавливает такие папки:
Когда я смотрю на «текущую» символическую ссылку, она указывает на самую последнюю версию. Сначала, открывая мое веб-приложение, все работало нормально. После развертывания новой версии текущая папка правильно указывает на новую версию, но веб-приложение пытается загрузить файлы из старой версии (которая была удалена в процессе очистки 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 после / кэширования старого расположения символических ссылок:
Единственная вещь, которая полностью прояснила бы эту проблему, – это цикл 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 . Я не тестировал это, хотя, поскольку я не заметил значительного влияния производительности, просто отключив кеш.