Настройка среды для тестирования и производства - PullRequest
3 голосов
/ 12 июня 2009

Я разрабатываю систему в CakePHP, используя Git в качестве системы контроля версий. У меня есть рабочая копия на моем тестовом сервере и другая копия на моем рабочем сервере, обе с разными базами данных. Каждый раз, когда я делаю изменения, я должен изменить конфигурацию базы данных, чтобы я мог протестировать систему. Есть ли другой способ сохранить два файла с различным содержимым, один в тесте, а другой на рабочем сервере? Ветки это хороший путь?

Ответы [ 3 ]

4 голосов
/ 12 июня 2009

Вы не хотели бы делать это с ветвями. Я не могу говорить с PHP конкретно, но вместо того, чтобы хранить два файла (тестовая конфигурация и производственная конфигурация) в отдельных ветвях, вы должны хранить их вместе, а просто позволить переменной среды определять, какой конфигурационный файл является правильным для использования при во время выполнения.

(Вот как это делается в Rails и работает хорошо.)

1 голос
/ 12 июня 2009

Я выбрал довольно грубую, но эффективную технику: в моей среде разработки у меня есть пустой файл с именем environment_development. В моей производственной среде у меня есть такая, которая называется «environment_PRODUCTION» (другой случай для дополнительного визуального акцентирования). Мой файл gitignore настроен на игнорирование обоих из них.

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

Раньше я использовал чек $ _SERVER ['SERVER_NAME'], но этот метод имеет следующие преимущества:

  1. Это работает, даже если есть части вашего приложения, которые вы хотите запустить из командной строки, например, как cronjobs, когда $ _SERVER не установлен.
  2. Это работает, даже если ваше приложение работает на нескольких доменах.
  3. Это совершенно очевидно: если кто-то извлечет другую рабочую копию приложения, ничего не будет работать, пока они не создадут файл среды, поэтому нет шансов (или очень мало) того, что кто-то запустит код разработки против рабочей базы данных или наоборот .
0 голосов
/ 12 июня 2009

Если база данных зависит от среды, вы можете сделать что-то подобное в файле database.php:

class DATABASE_CONFIG {

    var $default = NULL;

    var $prod = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'username',
        'password' => 'password',
        'database' => 'productionDatabaseName',
        'prefix' => '',
    );

    var $staging = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'username',
        'password' => 'password',
        'database' => 'stagingDatabaseName',
        'prefix' => '',
    );

    //var $dev = ...

    // Chooses production or staging depending on URL
    function __construct ()
    {
        if(isset($_SERVER['SERVER_NAME']))
        {
            switch($_SERVER['SERVER_NAME'])
            {
                case 'myhostname.com':
                case 'www.myhostname.com':
                    $this->default = $this->prod;
                    break;
                case 'staging.myhostname.com':
                    $this->default = $this->staging;
                    break;
                default:
                    $this->default = $this->dev;
            }
        }
        else // Use local for any other purpose
        {
            $this->default = $this->dev;
        }
    }
}
...