Предотвращение различий в файлах между живыми и промежуточными веб-сайтами и системными скриптами (PHP) - PullRequest
1 голос
/ 18 ноября 2009

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

Справочная информация:

Что я подразумеваю под «различиями конфигурации»? Как и большинство магазинов кода, мы используем непубличную «промежуточную» версию нашего веб-сайта, где мы тестируем код перед его отправкой. на живой сайт. Мы используем Subversion и имеем действующий веб-сайт в качестве «Транка» и «Постановка» в качестве ветви. Это облегчает жизнь, когда код переходит от подготовки к жизни, если версии файлов репозитория имеют минимальные различия. Но, очевидно, некоторые детали должны быть другими, например детали подключения к БД.

Как решаются различия в конфигурации с Apache

В PHP мы устанавливаем переменные, специфичные для ветви, следующим образом:

switch ($_SERVER['HTTP_HOST']) {
    case 'ourstagingurl.com':
        $dbPassword = "blahblah";
        break;
    default:
        $dbPassword = "blahblah";
}

или мы помещаем в файл .htaccess следующее, относящееся к конкретному сайту:

php_value dbPassword "blahblah"

Почему я не могу разрешить различия конфигурации с помощью CLI?

Когда скрипт запускается в CLI, суперглобальные переменные, такие как $_SERVER, отсутствуют. Я мог include файл конфигурации, используя абсолютный путь, но как я могу узнать, является ли сценарий живым или промежуточным? Я мог бы передать аргумент командной строки, который определяет среду, но я надеялся, что есть лучший способ?

Ответы [ 5 ]

2 голосов
/ 18 ноября 2009
$host = isset( $_SERVER['HTTP_HOST'] ) ? $SERVER_['HTTP_HOST'] : php_uname('n');

switch ( $host ) 
{
    case 'ourstagingurl.com':
        $dbPassword = "blahblah";
        break;
    default:
        $dbPassword = "blahblah";
}

Если версия php => 5.3, тогда вместо нее можно использовать gethostname ().

2 голосов
/ 18 ноября 2009

Эй, я работаю в компании с подобной настройкой. Что я обычно делаю, так это настраиваю scenerio, где промежуточные и живые серверы модифицируют общий и общий конфигурационный файл. Когда сайт будет развернут как на стадии подготовки, так и в режиме реального времени, информация будет неверной, и ее необходимо будет изменить один раз в каждом месте. Однако это ТОЛЬКО должно произойти один раз, потому что измененные вами части будут помечены как измененные с помощью Subversion и не будут перезаписаны с помощью Subversion в последующих обновлениях SVN.

1 голос
/ 18 ноября 2009

В некоторых моих приложениях я пытаюсь включить файл, который существует только для переопределения значений на сервере разработки. Я использую оператор dreaded @, но вы также можете использовать is_file ().

@include 'includes/debug.php';

debug.php попытается установить некоторые переменные:

define('DEBUG', true);
define('DB_PASSWORD', 'foobar');

Я говорю svn игнорировать этот файл. Он остается в моей проверке разработки и оказывает минимальное влияние на производство.

В более общем случае я использую проверку имени хоста, поскольку она работает как в CLI, так и в веб-приложениях, но вы заявили, что у вас есть обе ветви в одном окне, так что это не так.

1 голос
/ 18 ноября 2009

Если прямой и промежуточный серверы - это один и тот же сервер (почему вы не используете виртуализацию?), Вам, вероятно, придется прибегнуть к передаче аргументов в ваши сценарии, т.е. Вызовите php script.php staging для постановки и php script.php live для живого сайта. Кстати, если вы не знаете, аргументы доступны с помощью $ argv в вашем PHP-скрипте -> http://www.php.net/manual/en/reserved.variables.argv.php.

Хотя, возможно, вы могли бы получить часть пути к файлу и использовать его в качестве «окружения». то есть. когда макет файла /project/staging/script.php для размещения и /project/live/script.php для работы в реальном времени, должно быть легко получить среду из самого сценария, используя dirname (__ FILE __) - дополнительное пространство после того, как FILE потребуется быть удаленным - и удаляя из него папку / project. Довольно глупо, но это будет работать: p.

1 голос
/ 18 ноября 2009

Вы можете сделать так, как предложил Юрский период, или вы можете установить переменную окружения и прочитать ее через $_ENV.

...