Настройка веб-проекта PHP, инфраструктуры

Как я могу лучше настроить мою среду разработки PHP (LAMP), чтобы у меня были серверы разработки, создания и производства. One- "click" для любого из них, а также откат одного клика для любой версии. Откат также должен откат схемы базы данных и данных, как это было, когда этот исходный код был текущим.

Сейчас я сделал все это (кроме возможности отката DB) для одного приложения, используя сценарии оболочки. Мне любопытно узнать, как настроены среды других, а также, если есть какие-то общие инструменты или лучшие практики, которые следует соблюдать в отношении макета.

Итак, как вы это делаете? Какие существующие инструменты вы используете?

Спасибо!

ОБНОВЛЕНИЕ: просто уточнить, поскольку есть некоторая путаница в отношении того, что меня интересует.

Я действительно хочу, чтобы люди переключались с настройкой среды.

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

Если вы запускаете проект PHP и выполняете автоматическое тестирование при совершении (и/или ночной), как вы это делаете? Какую систему управления версиями вы используете? Используете ли вы SVN и запускаете свои тесты на крючках после фиксации?

Если вы запускаете проект PHP с несколькими серверами dev, промежуточным сервером и производственным сервером, как вы их организуете и как вы развертываете?

То, что я надеюсь получить от этого, - это хорошая идея, как другие склеивают все вместе.

Ответы

Ответ 1

Наша производственная среда включает в себя следующее:

  • 3 интерфейса, которые обслуживают наш веб-сайт.
  • 2 базы данных (Master-Slave, репликация)
  • 1, который запускает httpd и базу данных для рекламы

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

Изменения в базе данных

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

Если бы у меня было больше таких, я бы использовал Doctrine и Migrations здесь. У меня никогда не было возможности использовать их в производстве, но я уже много играл с ними, и они кажутся очень мощными.

Развертывание

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

Проверьте этот образец capfile:

role :www, "web01", "web02", "web03"
role :web, "web01", "web02", "web03", "web04"
role :db, "db01", "db02"

desc "Deploy sites"
task :deploy, :roles => :www do
    run "cd /usr/www/website && sudo svn --username=deploy --password=foo update"
end

Capistrano также позволяет запускать любую другую команду без определения задачи:

cap invoke COMMAND="uptime" ROLES=web

(Требуется настройка роли "веб". См. пример выше.)

Стиль и документация по кодированию

Мы в значительной степени придерживаемся стандарта кодирования PEAR, который мы проверяем с помощью PHP_CodeSniffer (phpcs). Когда я говорю довольно много, я имею в виду, что я искал принюшки и добавил несколько исключений из моего собственного удовольствия.

Помимо стиля кодирования, phpcs также проверяет встроенную документацию. Эта документация создается phpDocumentor в конце.

CI

У меня есть оба этих инструментария на нашем CI-сервере (непрерывная интеграция), которая phpUnderControl с использованием вышеприведенного и CruiseControl, phpUnit, Xdebug (пара метрик кода...) и т.д.

unit-testing - это то, чего нам в настоящее время не хватает. Но сейчас мы делаем то, что с каждой ошибкой, которую мы находим в нашем синтаксическом анализаторе (мы анализируем текст в определенных форматах), мы пишем тест, чтобы убедиться, что он не возвращается. Я также написал некоторые базовые тесты, чтобы проверить URL-маршрутизацию и внутренний XMLRPC API, но это действительно подлежит улучшению. Мы также используем тесты типа phpUnit и phpt.

CI-сервер создает новую версию пару раз в день, генерирует графики, документы и всевозможные отчеты.

Помимо всех упомянутых инструментов, мы также используем Google Apps (в основном для электронной почты) и сохраняем вики Google Sites со всей другой документацией. Например, процедура развертывания, списки проверки качества и т.д.

Ответ 2

Я заметил, что это не вызвало большой нагрузки. Это также то, что меня интересует. Знаете ли вы о Phing? Вы пробовали это?

Эндрю

Ответ 4

Для изменений базы данных у нас есть каталог в VCS:

+ dbchanges
|_ 01_database
|_ 02_table
|_ 03_data
|_ 04_constraints
|_ 05_functions
|_ 06_triggers
|_ 07_indexes

Когда вы вносите изменения в базу данных, вы помещаете файл .sql в правильный каталог и запускаете интеграцию script, которая проходит через эти каталоги по порядку, и импортирует каждое изменение в db.

Файлы sql должны начинаться с комментария, который отображается пользователю, когда скрипты интеграции импортируют изменение, описывая, что он делает. Он регистрирует каждое импортированное имя файла sql в файле, поэтому при следующем запуске script он не будет применять те же изменения снова.

Таким образом, все разработчики могут просто запустить script, чтобы обновить db.

Ответ 5

@andrew: Я пробовал Phing и попал в phpUnderControl. Проблема с Phing заключается в том, что для управления охватом кода он должен фактически включать в себя все файлы в вашем проекте, которые для нашего проекта просто этого не делают. Подход CruiseControl работал лучше для нас. Попробуйте их, их легко настроить - тяжелая работа - это построить тесты....