Чому мій $ _ENV порожній?


80

Я працюю, Apache/2.2.11 (Win32) PHP/5.3.0і я зробив наступне у своєму файлі .htaccess:

SetEnv FOO bar

Якщо я роздрукую $_ENVзмінну у файлі PHP, я отримаю порожній масив. Чому там не відображається моя змінна середовища? Чому спочатку він порожній?

Хоча я знайшов свою змінну, але вона відображається у цій $_SERVERзмінній. І з якихось причин це з’являється двічі. Чому це?

[REDIRECT_FOO] => bar
[FOO] => bar

Здається, я можу отримати його за допомогою getenv('FOO'), тому, можливо, мені слід просто використовувати це. Але мені все ще трохи цікаво, що це спричиняє. Це проблема Windows? Або що відбувається?


2
Не проблема Windows, це те ж саме в Linux (запуск PHP як модуля). Я не впевнений у подробицях, але можливо, веб-сервер не є таким самим, як PHP, і тому він надсилається як $_SERVERvar. Я б проголосував за використання, getenv()яке, наскільки я розумію, просто шукає їх, не враховуючи регістр.
Wrikken

1
Зауваження: екземпляр CLI все-таки це отримує $_ENV.
Wrikken

@svish Ваше оновлення мені допомогло. Якщо ви змінили його на відповідь, я б із радістю підтримав його.
Домінік Саєрс

@svish Ваше рішення, розміщене у питанні, справді має бути опубліковане як відповідь нижче. Це питання кілька разів пов'язували як дублікат близької мішені, але вирішення питання недоречне в цьому питанні :)
Michael Berkowski

@MichaelBerkowski Дякую за примітку. Гарна ідея. Робимо це зараз :)
Свіш

Відповіді:


120

Виявляється, тут було дві проблеми:

1. $_ENVзаповнюється лише в тому випадку, якщо php.ini дозволяє це , що, схоже, не робить за замовчуванням, принаймні не в установці сервера WAMP за замовчуванням .

; This directive determines which super global arrays are registered when PHP
; starts up. If the register_globals directive is enabled, it also determines
; what order variables are populated into the global space. G,P,C,E & S are
; abbreviations for the following respective super globals: GET, POST, COOKIE,
; ENV and SERVER. There is a performance penalty paid for the registration of
; these arrays and because ENV is not as commonly used as the others, ENV is
; is not recommended on productions servers. You can still get access to
; the environment variables through getenv() should you need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"

Коли я встановлюю variables_orderназад EGPCS, $_ENVбільше не є порожнім.

2. Коли ви використовуєте SetEnvу своєму .htaccess, він закінчується $_SERVER, а не$_ENV , що, я повинен сказати, трохи заплутує, коли його називають SetEnv...

# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/

# php
var_dump($_SERVER['ENV'], $_SERVER['BASE']);

// string 'dev' (length=3)
// string '/ssl/' (length=5)

3. getenvФункція завжди працюватиме і на неї не впливає налаштування PHP для $ _ENV. Крім того, схоже, вона робить це нечутливою до регістру, що може бути корисним.

var_dump(getenv('os'), getenv('env'));

// string 'Windows_NT' (length=10)
// string 'dev' (length=3)

6
ЗРІСТЬ! Дуже дякую!!! Ви не уявляєте, як довго я гуглив, думаючи, що проблема в mod_env чи щось інше. Я зовсім забув про variables_order! Дякуємо, що ви чудові !!!
Марсель

1
Здається, зараз значення слід встановлювати без лапок. (Помилка PHP: syntax error, unexpected '"' in php.ini)
yanot

1
Дякую! Скажіть, чи можете ви розділити це на три відповіді, щоб я міг підтримати його тричі? : D
Дуг Маклін

12

$_ENV змінні імпортуються із середовища, в якому працює PHP, і залежно від вашої установки (ОС, ваш сервер, чи працює PHP як модуль Apache, або під FastCGI тощо), це може сильно відрізнятися.

IIRC у стандартній установці Apache + mod_php на Windows, єдиний спосіб зміни змінних $_ENV- це зміна змінних середовища Windows (див. Це ). Це може бути суттєвим при роботі з розширеннями PHP у Windows, оскільки деякі з них (наприклад php_ldap:) можна налаштувати лише за допомогою змін середовища $_ENV.


1

REDIRECT_*змінні з'являються, якщо ви використовуєте RewriteRules. На моєму сервері вони також з'являються саме так. Це може мати щось спільне з запуском під FastCGI. А якщо поєднувати з suexec, це, швидше за все, очистить весь пул середовища. Для їх повернення можуть бути необхідні додаткові конфігурації PassEnv. Щодо того, чому getenv () працює для вас, я не маю поняття. Але всі явища характерні для вашого сервера та конфігурації php. Запитайте за замовчуванням сервера, вони повинні знати.


Ага. Я здогадувався, що модуль перезапису може мати до цього щось спільне. Просто не уявляю, чому це робиться. Але я впевнений, що у Apache є свої причини: p (або помилки)
Свіш

2
На той випадок, якщо ви втратили сон через те, чому це getenvпрацювало: Просто дізнався, що це, мабуть, шукає $_ENV і $_SERVER : p
Свіш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.