Каков наилучший способ определить, на каком сервере находится скрипт и, следовательно, конфигурация в PHP? - PullRequest
3 голосов
/ 20 октября 2008

Я пытаюсь определить наилучший способ заставить скрипт PHP определять, на каком сервере работает скрипт / сайт.

На данный момент у меня есть switch(), который использует $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'], чтобы определить, на каком сервере он работает. Затем он устанавливает несколько путей, параметры подключения к БД, параметры SMTP и параметры отладки в зависимости от того, на каком сервере он находится. (Там могут быть дополнительные параметры в зависимости от потребностей сайта.)

Это означает, что я могу просто перенести сайт на любой из настроенных серверов без необходимости изменения какого-либо кода (в частности, конфигурации). Если это новый сервер, тогда я просто добавляю новый case, и с этого момента он готов.

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

Другая проблема, с которой мы сталкиваемся, - это когда сайт часто перемещается между двумя серверами, но мы используем одинаковые SERVER_NAME и SERVER_PORT на каждом. Это означает, что нам нужно временно прокомментировать один случай и убедиться, что он не попадет в репозиторий.

Другие идеи? Он должен быть доступен на всех серверах (иногда SERVER_NAME и SERVER_PORT нет). Также было бы хорошо, если бы он работал с CLI PHP.

Ответы [ 8 ]

2 голосов
/ 20 октября 2008

Вот некоторые переменные, которые вы можете проверить:

$_SERVER['HTTP_HOST'];

Я использую этот для проверки того, на каком сервере я работаю, когда php работает через apache.

$_SERVER['USER'];
$_SERVER['LOGNAME'];

Я использую эти два, когда я знаю, что я бегу с консоли. Один из них неизменно разрешает использовать имя пользователя. Кажется, в консольном режиме нет других переменных, определяющих хост.

Это может вам не помочь; Если вам все еще трудно определить, на каком сервере вы находитесь, вы можете немного подтолкнуть его. В моей ситуации у меня есть небольшой конфигурационный файл, который уникален для каждого сервера, и в основном устанавливает переменную php, определяющую, в какой среде я работаю (например, development или production .) Таким образом, вам нужен только один небольшой, легко воссоздаемый файл за пределами вашего контроля версий.

2 голосов
/ 20 октября 2008

Мы используем переменную $ _SERVER ['HTTP_HOST'] для создания имени файла включаемого PHP-файла, который содержит всю специфичную для vhost информацию (мы используем одно и то же программное обеспечение для большого количества vhosts)

Мне нравится этот метод, так как вы можете научиться использовать его для построения иерархий конфигураций, например, для www.foo.com,

  • попробуйте загрузить com.config.php
  • попробуйте загрузить foo.com.config.php
  • попробуйте загрузить www.foo.com.config.php

Делая это таким образом, вы можете устанавливать параметры для всех ваших живых сайтов по всему миру и настраивать отдельные сайты по мере необходимости. У нас есть собственное имя внутреннего корневого домена для песочниц разработчика, поэтому мы можем включить все параметры уровня разработчика в internal.config.php

Вы также можете сделать это в обратном порядке, то есть попытаться загрузить www.foo.com.config.php, и только если вы не найдёте, попытаетесь загрузить foo.com.config.php и т. Д. Более эффективный, но немного менее гибкий.

2 голосов
/ 20 октября 2008

Как насчет использования $ _ SERVER ['SERVER_ADDR'] и основывать свою идентификацию на IP-адресе сервера.

ОБНОВЛЕНИЕ: В ситуации с виртуальным хостом вам также может потребоваться объединить IP-адрес с корневым путем документа следующим образом:

$id = $_SERVER['SERVER_ADDR'] . $_SERVER['DOCUMENT_ROOT'];
1 голос
/ 04 сентября 2009

Я использовал следующий механизм:

if(__FILE__ === '/Sites/mywebsite.com/includes/config.php')
    define('SERVER', 'DEV');
else
    define('SERVER', 'PRODUCTION');

Моя среда разработки имеет довольно четкую структуру путей, поэтому она хорошо работает, и мне не нужно беспокоиться, если дополнительные домены будут добавлены в $_SERVER[HTTP_HOST], или клиент, предоставляющий неверное значение HTTP_HOST (хотя это бывает редко). ...).

1 голос
/ 20 октября 2008

Я всегда держал config.php на своих сайтах, храня такую ​​информацию, которая может иметь отношение к этому серверу.

  • При разборе php это почти (например, файл должен быть открыт, закрыт и т. Д.) Так же быстро, как и код в верхней части каждого скрипта, и намного быстрее, чем решения для ini и xml config
  • Централизованное расположение конфигурации сайтов на каждом сервере, поэтому легко обновлять данные (сервер не меняет это время, обновление конфигурации просто с помощью скрипта обновления).
  • Может быть сгенерировано скриптом, на всех моих сайтах есть функция, которая перестраивает файл конфигурации с использованием массива $ config [] assoc.
  • Обновления, влияющие на файл конфигурации, так же просты, как "$ config ['key'] = 'new value'; config_update ()"
0 голосов
/ 20 января 2010

Для этого мы используем переменные среды (переменная среды ENVPHP, которая будет содержать конкретную серверную среду - т. Е. Разработка / тестирование / производство). Этот подход очень хорошо работает и для скриптов CLI (для CLI вы устанавливаете переменные среды ОС, для Apache вы можете использовать переключатели SetEnv в конфигурации хоста). В PHP вы получаете доступ к этой переменной среды, используя getenv ('ENVPHP') ...

0 голосов
/ 21 октября 2008
$posix_uname   = function_exists('posix_uname') ? posix_uname() : null;
$this_hostname = !empty($_SERVER["HOSTNAME"]) ? $_SERVER["HOSTNAME"] : $_ENV["HOSTNAME"];
$this_hostname = !empty($this_hostname) ? $this_hostname : $posix_uname['nodename'];
0 голосов
/ 20 октября 2008

Почему у вас нет файлов конфигурации для каждого хоста, которые хранятся вне директории проекта и не читаете их из кода php?

Наличие специального кода хоста не очень хорошая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...