Обнаружение среды в скриптах PHP CLI

Я видел несколько вопросов о StackOverflow, которые обрабатывают, как обнаружить пользовательскую среду, когда script подается через Apache и имеет такую ​​систему, которая работает отлично. script зависит от настроек окружения, установленных Apache.

Теперь я создаю несколько инструментов, которые нужно запускать в режиме командной строки php, но я не знаю, как определить среду в режиме CLI, поскольку там нет apv env vars.

Я думаю о чтении имени хоста сервера с gethostname(), но не знаю, является ли это лучшим решением и надежным решением.

Что считается лучшим способом обнаружения вашей среды при работе в режиме CLI с PHP

Разъяснение:
Я не ищу способ обнаружить, что я запускаю script из CLI, эта база покрыта. Я ищу способ определить, на каком сервере работает мой script (DEV, STAGING или PRODUCTION) через CLI, поэтому не читайте переменные env env, установленные в моем VHOST, которые присутствуют при запуске того же script через браузер.

Ответы

Ответ 1

Вы можете использовать php_uname('n'), чтобы получить имя хоста вашего текущего компьютера. Оттуда это до вашей реализации, чтобы определить, будет ли это производство, постановка или разработка, либо на основе шаблонов в имени хоста, и в жестких закодированных значениях, либо в другом файле конфигурации.

Ответ 2

Я бы установил переменную в /etc/environment (или ее эквивалент, основанный на значении ОС), например MYAPP_ENV=STAGING.

Это будет автоматически вызвано запуском CLI php и станет доступным в $_SERVER Глобальной переменной как таковой: _$SERVER['MYAPP_ENV']

Если вы ожидаете, что это будет работать, будет ли script запущен из HTTPD или CLI, вам также необходимо установить эту переменную (предполагая apache) в .htaccess или файле apache vhosts.conf для вашего приложения как такового: SetEnv MYAPP_ENV STAGING

Из вашего кода приложения вам просто нужно ссылаться на _$SERVER для доступа к этой переменной независимо от того, является ли вызов из CLI или через http.

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

Ответ 3

Посредством среды я предполагаю, что вы имеете в виду операционную систему, и есть способ сделать это с любым способом, с Apache или нет: константа PHP_OS и функция php_uname().

Если вы имеете в виду "определить, является ли это CLI или нет", просто проверьте isset($GLOBALS['argv']) - он не будет установлен с использованием веб-сервера, это будет, если это CLI. Или вы можете сделать (PHP_SAPI === 'cli').

Ответ 4

Я всегда использовал сопоставление именования с именами хостов сервера: Представление имен хостов выглядит так:  - server.production.project.com  - server.development.project.com

Вы можете определить хост, используя его имя и некоторую магию bash (или php):

$server_env = `hostname | cut -d \. -f 2`; # production or development
# pure php (5.3+) method:
$server_name = gethostname();
$server_name_arr = explode( '.', $server_name );
$server_env = $server_name_arr[1];

Имена хостов должны быть, разумеется, разными;) Приветствия

Ответ 5

вам, скорее всего, нужно будет установить системную систему env, а не только из apache, тогда скрипты apache могут ее прочитать. И cli-скрипты могут читать ее из ENV, вы должны установить их для интерактивных оболочек через /etc/profile, например

APP_ENV = 'постановка'

экспорт APP_ENV

(вы делаете это через 2 строки, так что другие вещи в script позже могут также ссылаться на APP_ENV и получать одинаковое значение, в противном случае APP_ENV не будет использоваться для этой оболочки до ее повторного запуска)

то просто проверьте $_ENV из своих программ на cli или apache, но apache может потребоваться перезапуск, но с тех пор, как я использовал это на практике, но он отлично подходит для json-кодированных настроек для соединений DB, но thats для другого сообщения.

Ответ 6

Чтобы не определять переменные окружения дважды, я сделал следующее (в Ubuntu).

Определите свои переменные в файле /etc/profile.d/env.sh, например   export APPLICATION_ENV = production

Включите этот файл в /etc/apache 2/envvars, добавив следующую строку:   , /etc/profile.d/env.sh

Перезапустите apache2 и вашу оболочку, чтобы перезагрузить среду.

Ответ 7

Насколько я знаю, вы можете использовать $_ENV и getenv() при запуске в оболочке, как и во время работы под веб-сервером, хотя фактические значения, доступные в env, вероятно, будут отличаться.

Ответ 8

$cli = false;
if (isset($argc)) $cli = true;

Смотрите: $argc