Вопрос или проблема
Я работаю над веб-приложением на PHP, которое также имеет некоторые инструменты командной строки. Мне нужно, чтобы инструменты командной строки определяли окружение, чтобы подключаться с правильными учетными данными для базы данных и т.д. Веб-приложение делает это легко, проверяя $_SERVER['SERVER_NAME']
, но это не работает для скрипта оболочки.
Я хотел бы создать свою собственную переменную $_SERVER
, которую может проверять скрипт оболочки. Например: $_SERVER['MYAPP_ENVIRONMENT']
. Как мне это сделать?
Я нашел это решение, но я не вижу таких же файлов в /etc/apache2/
. Я также нашел это, но они используют .htaccess, и я не уверен, есть ли у меня mod_env
, и также мое приложение использует свой собственный файл .htaccess, так что его придется редактировать каждый раз, когда я развертываю.
Я на VPS Dreamhost, который работает на Ubuntu 12.04 LTS
Как насчет использования функции php_sapi_name()
( http://php.net/manual/en/function.php-sapi-name.php ), чтобы определить используемую серверную API?
Вы можете использовать аргументы командной строки, чтобы различать их, и использовать массив $argv
для доступа к ним:
<?php
if (PHP_SAPI == "cli") {
var_dump($argv);
}else{
echo 'WebServer';
}
?>
И его вывод:
C:\Users\user>E:\xampp\php\php.exe -f E:\Apache\test\s.php 1st 2nd
array(3) {
[0]=>
string(20) "E:\Apache\test\s.php"
[1]=>
string(3) "1st"
[2]=>
string(3) "2nd"
}
Несколько вещей о $argv:
- Это суперглобальный массив.
- Первым элементом является имя скрипта (или полный путь, если вы передали полный путь).
- Существует другая суперглобальная переменная $argc, которая содержит количество элементов $argv.
- register_argc_argv должен быть включен, в противном случае
$argv
будет NULL. - Эта переменная не определена, когда вы обращаетесь к скрипту из браузера (только для CL).
Как вы удачно заметили, Apache позволяет эту функцию, например, записывая SetEnv
в конфигурации vhost – это действительно работает!
<VirtualHost *:80>
...
SetEnv APPLICATION_ENV "production"
...
</VirtualHost>
Так что в PHP вы получите $_SERVER['APPLICATION_ENV']
со значением production
Правильная переменная для проверки переменных окружения – это $ENV
. Это работает как в CLI, так и в скриптах, выполняемых Apache.
$_ENV['HOSTNAME']
Или вы устанавливаете любую переменную окружения, которую хотите, в своей системе.
Ответ или решение
Установка пользовательской переменной $_SERVER в PHP
В современном веб-разработке, особенно если ваша система включает как веб-приложения, так и командные утилиты, управление окружением является ключевым аспектом. В этом ответе мы рассмотрим, как создать пользовательскую переменную $_SERVER
, чтобы ваши командные скрипты могли определять окружение и использовать соответствующие конфигурации для подключения к базе данных.
1. Понимание $_SERVER и $_ENV
Переменная $_SERVER
в PHP предоставляет информацию о сервере и среде выполнения, в которой выполняется скрипт. Она включает такие параметры, как $_SERVER['SERVER_NAME']
, которые удобны для веб-приложений, но не доступны в контексте командной строки. Однако, можно воспользоваться переменной $_ENV
для доступа к системным переменным окружения.
2. Использование Apache и конфигурации окружения
Если вы используете Apache, вы можете установить свои переменные окружения, используя директиву SetEnv
в конфигурации вашего виртуального хоста. Например:
<VirtualHost *:80>
...
SetEnv MYAPP_ENVIRONMENT "production"
...
</VirtualHost>
После этого в вашем PHP-коде вы сможете получить доступ к переменной следующим образом:
$environment = $_SERVER['MYAPP_ENVIRONMENT'];
Это подход позволяет четко различать окружения для веб-контекста, гарантируя, что ваши командные утилиты и веб-приложение работают с одними и теми же настройками.
3. Настройка переменной для CLI
Для выполнения командных утилит можно установить переменные окружения непосредственно в самом PHP-скрипте. Например, чтобы обеспечить кофигурацию для CLI, вам следует проверить, запущен ли ваш скрипт в режиме командной строки:
if (PHP_SAPI === "cli") {
putenv("MYAPP_ENVIRONMENT=cli_environment"); // Устанавливаем переменную
$_SERVER['MYAPP_ENVIRONMENT'] = "cli_environment"; // Для доступа в $_SERVER
}
Это позволяет вашему коду внутри скрипта определить, что он исполняется из командной строки, обеспечивая корректное подключение к необходимым ресурсам, таким как базы данных.
4. Использование $argv для передачи аргументов
Если ваша командная утилита требует дополнительных параметров, рассмотрите возможность использования массива $argv
, который предоставляет аргументы командной строки:
if (PHP_SAPI === "cli") {
var_dump($argv);
}
В качестве примера, если вы запустите скрипт как php script.php 1st 2nd
, то в $argv
вы получите массив, где первый элемент – это имя скрипта, а остальные – параметры.
5. Установка окружения через .env
файлы
Еще один современный и популярный подход – использование файлов .env
, которые содержат в себе переменные окружения. Вы можете использовать библиотеку vlucas/phpdotenv
, чтобы автоматически загружать конфигурации из .env
:
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$environment = $_ENV['MYAPP_ENVIRONMENT'];
В этом случае, при каждом запуске вашего приложения или командного скрипта переменная окружения будет загружаться из файла .env
.
Заключение
Управление окружениями в PHP веб-приложениях и командных утилитах не только важно, но и необходимо для поддержания упорядоченности и удобства в работе с проектом. Используя директиву SetEnv
в конфигурации Apache, устанавливая переменные окружения в скриптах или применяя файлы .env
, вы можете оказывать значительное влияние на функциональность и конфигурацию вашего приложения.
Эти методы позволяют гибко управлять настройками окружения, что особенно актуально при развертывании на разных серверах или в различных окружениях.