Как мы можем проверить, запускаем ли мы скрипт PHP на локальном хосте?

Есть ли способ проверить, запускаем ли мы скрипт PHP на локальном сервере разработки или на рабочем сервере - производственном сервере? Есть ли какие-либо константы, переменные, функции и т. Д. PHP, которые могут дать мне эту информацию.

Мне это нужно, чтобы установить разные настройки для сервера производства и разработки. Теперь я анализирую URL-адрес, чтобы увидеть, какой именно, но мне было интересно, есть ли лучший способ сделать это. Меня беспокоит то, что мы можем изменить URL-адрес скрипта, и это может испортить мой чек.

Я ищу несколько решений с одним файлом конфигурации и условием IF, в зависимости от которого я буду определять разные настройки. Единственная проблема заключается в том, что я не хочу изменять оператор IF, когда есть изменения в настройках сервера, таких как имя хоста, каталог-документа или что-то еще, что я использую для идентификации локального / удаленного хоста.

И хочу обновить SVN из одного источника, ничего не меняя на моем производственном сервере.

И я хотел бы в идеале иметь возможность запускать и CRON-задания с этими настройками.


person Yasen Zhelev    schedule 24.01.2011    source источник
comment
Использует ли ваша локальная (хостовая) среда тестирования то же имя хоста, что и производственная среда?   -  person John Parker    schedule 24.01.2011
comment
вы используете фреймворк, в котором у вас есть сжатое расположение конфигурации?   -  person jondavidjohn    schedule 24.01.2011
comment
@middaparka нет, это не так, но я не хочу использовать имя хоста, потому что оно может быть изменено в будущем, и это потребует ручного изменения кода.   -  person Yasen Zhelev    schedule 24.01.2011
comment
@Yasen Zhelev Я собирался предложить сначала поискать файл конфигурации на основе имени хоста, а затем вернуться к настройкам по умолчанию на реальном сервере. Если вы используете определения, то все, что вам нужно сделать, это if (! Defined (... проверить основную живую конфигурацию, и все должно быть в порядке. (Кроме того, для живого сайта невозможно использовать неправильную конфигурацию, так как это предположительно не будет отвечать на имена локальных хостов.)   -  person John Parker    schedule 24.01.2011
comment
А как насчет того, если вы выполняете CRON JOB, и там нет имени хоста.   -  person Yasen Zhelev    schedule 24.01.2011


Ответы (10)


Я использую SetEnv в определении моего хоста, чтобы определить, в какой среде я работаю (Dev, Stage, Production):

<VirtualHost *:80>
(all the host info)
SetEnv SERVER_CONTEXT "dev"
</VirtualHost>

И каждый файл конфигурации в качестве дополнительного слова в нем: config.dev.ini, config.stage.ini, config.prod.ini и т. Д. ... Он работает как шарм.

person Mikushi    schedule 26.01.2011
comment
А как насчет того, если вы выполняете CRON JOB. Нет VirtualHost - person Yasen Zhelev; 27.01.2011
comment
Предполагая, что система Unix, я бы установил переменную среды (путь ubuntu может отличаться в другой системе Unix): sudo vim / etc / environment Добавить PHP_SERVER_CONTEXT = dev В php: getenv (PHP_SERVER_CONTEXT); Проверьте свой файл CLI php.ini, если PHP_ является префиксом (должен быть) в safe_mode_allowed_env_vars - person Mikushi; 27.01.2011
comment
хорошее предложение; Я просто помещаю переменную в командную строку, например ENVIRONMENT=dev php foo.php, поскольку я могу запускать вещи для нескольких сред на одном сервере, но ваш подход, вероятно, проще для большинства настроек. - person El Yobo; 28.01.2011
comment
Я знаю, что меня иногда раздражают цитаты :) но как насчет среды Windows и работы Cron? - person Yasen Zhelev; 28.01.2011
comment
@Yasen: Панель управления- ›Система-› Дополнительно- ›Переменные среды, которые тоже должны работать, я редко работаю с PHP в Windows, но я считаю, что PHP будет читать эти переменные, поэтому он должен работать. - person Mikushi; 28.01.2011

if($_SERVER["REMOTE_ADDR"]=="127.0.0.1"){
$local = True;
}else{

    $local = False;
}

ИЗМЕНИТЬ

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

person armonge    schedule 28.01.2011
comment
Сервер разработки не обязательно должен быть на моей машине. - person Yasen Zhelev; 28.01.2011
comment
Нет, это не так ... однако это один из наиболее распространенных сценариев, и именно этим мы на самом деле занимаемся в моей компании. - person armonge; 28.01.2011
comment
У этого есть один недостаток - удаленный адрес может быть другим даже в вашей домашней / корпоративной сети, если вы, например, протестируйте приложение на своем реальном мобильном телефоне или попросите коллег протестировать приложение. - person Alexander Dobernig; 07.02.2021

Используйте файл конфигурации, который вы включаете, с определением в нем

define("DEBUG",true); //set to false for live

и используйте это в своем коде, например:

if(DEBUG){}
person Nanne    schedule 24.01.2011
comment
Я должен изменить это, когда работаю в продакшене :( Это не то решение, которое я ищу. - person Yasen Zhelev; 24.01.2011
comment
в любом случае должна быть пара отличий, например, ваш БД и т. д., так что это наиболее элегантное решение. - person Nanne; 24.01.2011

Я устанавливаю переменную среды в конфигурации Apache и проверяю это. Это имеет то преимущество перед использованием файла конфигурации PHP, что весь код вашего приложения остается точно таким же в PROD, TEST, DEV и т. Д .; не нужно идти и вносить изменения после проверки, так как код просто извлекает конфигурацию из Apache.

Для демонстрации в вашей конфигурации VirtualHost можно установить следующее:

SetEnv ENVIRONMENT PROD

Затем в своем PHP-коде вы можете проверить среду с помощью

$env = getenv('ENVIRONMENT');

Если вы чувствуете необходимость сделать это доступным повсюду, вы можете затем использовать define, но я не считаю это необходимым (я использую указанную среду для загрузки соответствующих файлов конфигурации и создания конфигурации Singleton только для чтения, которая затем используется чтобы проверить любые параметры конфигурации; лучше, чем код типа if ($env == 'PROD') {}, поскольку вся эта логика находится в конфигурации, а не в вашем коде).

person El Yobo    schedule 26.01.2011
comment
А как насчет того, если вы выполняете CRON JOB. Нет конфигурации VirtualHost - person Yasen Zhelev; 27.01.2011
comment
Еще проще, если вы добавите к скрипту префикс ENVIRONMENT=PROD php foo.php. Это также определяет переменную среды с помощью bash, и она подбирается с точно таким же кодом PHP, поэтому никаких изменений в коде вашего приложения не требуется. - person El Yobo; 27.01.2011
comment
Нет, окна делают это намного сложнее; вы не можете определить его "на лету", как в большинстве оболочек Linux. Однако по-прежнему можно установить переменные среды, и я предполагаю, что они будут подобраны (хотя вам нужно будет это проверить). Ознакомьтесь с support.microsoft.com/kb/310519 или support.microsoft.com/kb/310519 для примеров (похоже, зависит от версии ОС). - person El Yobo; 28.01.2011
comment
Ты потрясающая,. +1. Ты действительно спас мне день. Это решение на 100% безопасно? Я имею в виду не вероятность того, что такой же флаг существует где-то еще, а какая-то подмена getenv? Спасибо! - person Jacek Kowalewski; 08.08.2015
comment
Что ж, нет ничего полностью безопасного, но, как правило, загрузка конфигурации вашего приложения происходит довольно рано, поэтому нет огромных возможностей для подделки. Если вы проверите, что полученное вами значение является одним из ожидаемых (например, разработка, производство), и вернетесь к использованию разумного значения по умолчанию, если оно покрыто, все будет в порядке. - person El Yobo; 09.08.2015

Вы можете попробовать и использовать глобальный $_SERVER['SERVER_NAME'] Это должно вам сказать имя хоста системы, в которой запущен сценарий. Вы можете использовать это, чтобы определить, какие настройки использовать (в зависимости от системы).

Однако я не знаю, выведет ли это «localhost», и вам может потребоваться знать фактическое имя хоста вашей машины разработки.

person pseudoramble    schedule 24.01.2011
comment
Что делать, если имя хоста изменится, мне придется изменить его во всех приложениях? Я пытаюсь этого избежать. - person Yasen Zhelev; 24.01.2011
comment
Да - если имя хоста изменится, вам придется его обновить. Это прискорбно, но это правда. Еще одна вещь, которая может помочь, - это сохранение двух разных версий файлов конфигурации. На производственной машине должна быть одна версия, а на вашей - собственная. Предполагая, что у вас есть какой-то контроль версий, просто не проверяйте свою версию. Это поможет изолировать их. - person pseudoramble; 24.01.2011

Сервер понятия не имеет, что это за среда, пока вы ему не скажете. Я использую DEFINE для настройки среды. Код моего приложения одинаков для всех экземпляров, но мои файлы конфигурации меняются. Таким образом, вы можете использовать файл .htaccess, включать файлы конфигурации в каждый сценарий и проверять их настройки.

person Amir Raminfar    schedule 24.01.2011

Я знаю, что это слово может показаться странным для PHP-разработчика, но рассматривали ли вы возможность сборки вашего проекта?

В PHP компилировать нечего, однако изменение скопированных файлов - одна из особенностей любого процесса сборки. Вы можете указать 2 цели: производство и разработчик. Нет необходимости в каких-либо условных выражениях, которые должны работать или могут работать, но при некоторых обстоятельствах не будут.

person Danubian Sailor    schedule 28.01.2011
comment
Это похоже на то, что я делаю. Для любого проекта, требующего нескольких сред, я предоставляю инструмент, который генерирует настройки в предсказуемом месте, которое мое приложение будет читать. Само приложение не знает, в какой среде оно развернуто. - person Chris; 16.08.2016

я всегда делаю "config.php", который я включаю в другие файлы php ...

он содержит что-то вроде (домашний файл):

$CONFIG['server']="dev";
$CONFIG['db_user']="root";

и тому подобное ... так что дома у меня есть это там, а на сервере, где работает сайт, у меня есть еще один, который я не обновляю, если не меняю его ...

поэтому на сервере у меня есть что-то вроде:

$CONFIG['server']="prod";
$CONFIG['db_user']="lwu9918_admin";

а затем в других файлах php:

include("config.php");
if($CONFIG['server']=="dev"){echo "Development";}

такая штука!

person FeRtoll    schedule 26.01.2011

На сервере разработки

* * * * * php -r cronjob.php this_is_dev

На производственном сервере

* * * * * php -r cronjob.php this_is_live

В вашем сценарии

switch ($argv[1])
  case 'this_is_dev':
    // load your dev configuration
    break;

  case 'this_is_live':
    // load your live configuration
    break;

  default:
    die('invalid server');
    break;
}

поскольку предназначен для cronjob, $argv существует

удачи с виндой :(

person ajreal    schedule 28.01.2011

вам лучше поместить программу запуска cli вне каталога www, например

c: \ iis \ www - общедоступный каталог html

вместо этого файл cli следует поместить в папку c: \ iis

person chings228    schedule 16.08.2016