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

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

14
задан tereško 1 July 2012 в 19:32
поделиться

5 ответов

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

  • 3 frontends, кто служит нашему веб-сайту
  • 2 бэкенда базы данных ("Главный-подчиненный", репликация)
  • 1 смешанный, какие выполнения httpd и база данных для adserving

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

изменения Базы данных

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

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

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

Поэтому каждый раз, когда мы развертываем новую версию, мы создаем тег кода, который мы проверяем на подготовку, затем проходим пару списков проверок и т.д., и затем мы развертываем код производства frontends. Для того, чтобы сделать все развертывание, у меня есть пара установки задач в 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

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

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

Мы в значительной степени придерживаемся ГРУШЕВЫЙ стандарт Кодирования , который мы проверяем использование PHP_CodeSniffer (phpcs). Когда я говорю в значительной степени, я подразумеваю, что разветвил обеспеченный сниффинг и добавил несколько исключений моего собственного удовольствия.

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

CI

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

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

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

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

12
ответ дан 1 December 2019 в 14:12
поделиться

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

Andrew

1
ответ дан 1 December 2019 в 14:12
поделиться

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

0
ответ дан 1 December 2019 в 14:12
поделиться

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

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

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

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

Таким образом, все разработчики могут просто запустить сценарий, чтобы довести базу данных до дата.

1
ответ дан 1 December 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: