Обнаружение среды в скриптах 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