Intereting Posts
Как запустить только один процесс веб-загрузки в приложении Laravel? Как я могу получить совпадения при использовании preg_replace в PHP? Ошибка PHP APC Загрузка apc.so Значения массива группы на основе ключа в php? Предотвращение фиксации сеанса путем обеспечения единственного источника создания сеанса должно быть безопасным случайным генератором Отобразить сообщение об ошибке для пользовательской проверки в Laravel 4 строка поиска синтаксического анализа для фраз и ключевых слов функция возвращается только один раз, почему? Есть ли способ программирования 100% объектно-ориентированного в PHP? Создание чистого текста с использованием php CodeIgniter или эквивалент PHP Rails Partials and Templates проблема с вложением электронной почты – почему я не получаю файл правильно? Как использовать метод jquery $ .post () для отправки значений формы Вы знаете какие-либо популярные PHP-шаблоны для php, которые имеют концепцию текущего контекстного узла? Как использовать глобальный тип пространства имен, намекающий внутри класса с именами в PHP 5.3+?

Развертывание приложения Symfony2 с Capifony – загрузчик APC по-прежнему использует предыдущий выпуск

Недавно я обновил приложение Symfony2 до версии 2.1 и перенесил его на новый сервер, поэтому решил, что сконфигурирую Capifony для упрощения развертывания. Все прошло отлично, за исключением того факта, что теперь он не использует APCLoader, поэтому мне пришлось прокомментировать это временно, пока он не будет отсортирован.

Вот соответствующий код из app.php :

 $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; // Use APC for autoloading to improve performance. // Change 'sf2' to a unique prefix in order to prevent cache key conflicts // with other applications also using APC. $loader = new ApcClassLoader('my_prefix', $loader); $loader->register(true); 

Проблема в том, что 'my_prefix' не уникален для каждого релиза, поэтому он попытается найти кэшированные файлы, принадлежащие предыдущим выпускам, которые могут или не могут быть все еще там. Это, очевидно, очень большая проблема!

Что было бы лучшим решением для этого? Должен ли я как-то написать задачу, которую capifony будет запускать до развертывания, которая изменяет префикс на нечто уникальное, например переменную #{latest_release} ? Или мне нужно как-то сбросить все содержимое кэша APC после каждого развертывания?

Я не слишком уверен в лучшем способе сделать что-либо из этого, поэтому, если вы порекомендовали бы одного из них, можете ли вы указать мне в правильном направлении, чтобы иметь возможность его реализовать? Или есть альтернативное решение, о котором я не думал?

Вы можете использовать ApcBundle , который предоставляет команду, которая создаст новый файл в каталоге web/ , выполнит его через HTTP, а затем удалит. Затем вы можете использовать команду run "/path/to/app/console apc:clear" в вашем сценарии развертывания.

Вы можете попробовать очистить кеш APC.

Самый простой способ сделать это – перезапустить Apache.

Вы также можете написать скрипт PHP для этого:

 <?php apc_clear_cache(); 

Видеть:

Делает ли изящный Apache перезапуск очистки APC?

http://php.net/manual/en/function.apc-clear-cache.php

Другим, потенциально более простым решением для этого было бы просто создать файл classmap как часть вашего процесса выпуска, вместо использования APC для карты классов. Я не смог отследить причину (пока, во всяком случае), но я обнаружил, что даже когда я очищаю кеш пользователя apc после развертывания новой версии, старая версия все еще может загрязнять кеш. (Я не уверен, как, поскольку я использую метод, подобный предложенному theunraveler, чтобы очистить его, и я делаю это после обновления символической ссылки к новой версии, поэтому старые файлы больше не будут доступны, но все равно это происходит. Изменить: выяснить, почему это происходит. См. https://stackoverflow.com/a/22680064/160565 )

Во всяком случае, я просто перешел на использование композитора, чтобы сбрасывать файл автозагрузчика, как описано в разделе «Использование функциональности карты класса Composer» здесь: http://symfony.com/doc/current/book/performance.html

В основном вам нужно удалить материал ApcClassLoader из app.php, а затем добавить эту строку в ваше развертывание:

 php composer.phar dump-autoload --optimize 

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

Edit: Кроме того, если вы используете подход очистки кэша APC после развертывания новой версии, убедитесь, что вы также очистили кеш реального кэша php (или отключили его), как описано здесь . В противном случае php продолжит доступ к файлам из вашей старой версии после очистки кэша, что приведет к повторной заселенности с неправильными путями.

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