Как установить пользовательскую переменную $_SERVER для PHP

Вопрос или проблема

Я работаю над веб-приложением на 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:

  1. Это суперглобальный массив.
  2. Первым элементом является имя скрипта (или полный путь, если вы передали полный путь).
  3. Существует другая суперглобальная переменная $argc, которая содержит количество элементов $argv.
  4. register_argc_argv должен быть включен, в противном случае $argv будет NULL.
  5. Эта переменная не определена, когда вы обращаетесь к скрипту из браузера (только для 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, вы можете оказывать значительное влияние на функциональность и конфигурацию вашего приложения.

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

Оцените материал
Добавить комментарий

Капча загружается...