2012-11-26 9 views
35

Mój system jest Ubuntu i ustawiłem zmienne środowiskowe w /etc/environment.Jak uzyskać zmienne środowiskowe systemu w PHP przy uruchomieniu CLI i Apache2Handler?

Jeśli biegnę skryptu PHP użyciu CLI - zmienne środowiskowe z /etc/environment są rozpoznawane.

Ale, jeśli pójdę do wykonania skrypt PHP thru http://domain/test.php (czyli apache2handler) dokładnie ten sam skrypt wypisuje NULL, czyli zmienne środowiskowe z /etc/environment nie są ładowane.

Naprawiłem, że dodałem zmienne w /etc/apache2/envvars i to rozwiązało problem.

Ale to są dwa różne pliki, które należy następnie zsynchronizować.

Jak mogę dokonać PHP/Apache obciążenia i uznania zmienne środowiskowe z /etc/environment (system)?

EDIT: Do wyjaśnienia sprawy, kiedy mówię „nie załadowany do PHP” oznacza, że ​​zmienne z /etc/environment nie są ustawione w $_SERVER, $_ENV, getenv() i nie istnieje w $GLOBALS. Innymi słowy "nie są załadowane do PHP".

Odpowiedz

46

Miałem dokładnie ten sam problem. Aby go rozwiązać, po prostu pozyskałem /etc/environment wewnątrz /etc/apache2/envvars.

Zawartość /etc/environment:

export MY_PROJECT_PATH=/var/www/my-project 
export MY_PROJECT_ENV=production 
export [email protected] 

Zawartość /etc/apache2/envvars:

# Load all the system environment variables. 
. /etc/environment 

Teraz jestem w stanie używać tych zmiennych w Apache plików konfiguracyjnych Wirtualny Host w PHP.

Oto przykład wirtualnego hosta Apache:

<VirtualHost *:80> 
    ServerName my-project.com 
    ServerAlias www.my-project.com 
    ServerAdmin ${MY_PROJECT_MAIL} 
    UseCanonicalName On 

    DocumentRoot ${MY_PROJECT_PATH}/www 

    # Error log. 
    ErrorLog ${APACHE_LOG_DIR}/my-project.com_error.log 
    LogLevel warn 

    # Access log. 
    <IfModule log_config_module> 
    LogFormat "%h %l %u %t \"%m %>U%q\" %>s %b %D" clean_url_log_format 
    CustomLog ${APACHE_LOG_DIR}/my-project.com_access.log clean_url_log_format 
    </IfModule> 

    # DocumentRoot directory 
    <Directory ${MY_PROJECT_PATH}/www> 
    # Disable .htaccess rules completely, for better performance. 
    AllowOverride None 
    Options FollowSymLinks Includes 
    Order deny,allow 
    Allow from All 

    Include ${MY_PROJECT_PATH}/config/apache/inc.mime-types.conf 
    Include ${MY_PROJECT_PATH}/config/apache/inc.cache-control.conf 

    # Rewrite rules. 
    <IfModule mod_rewrite.c> 
     RewriteEngine on 
     RewriteBase/

     # Include all the common rewrite rules (for http and https). 
     Include ${MY_PROJECT_PATH}/config/apache/inc.rewriterules-shared.conf 
    </IfModule> 
    </Directory> 
</VirtualHost> 

I to jest przykład, jak uzyskać do nich dostęp z PHP:

<?php 
header('Content-Type: text/plain; charset=utf-8'); 
print getenv('MY_PROJECT_PATH') . "\n" . 
     getenv('MY_PROJECT_ENV') . "\n" . 
     getenv('MY_PROJECT_MAIL') . "\n"; 
?> 
+0

W moim przypadku w/etc/environment musiałem oddzielić każdą deklarację zmiennej na dwie linie: najpierw 'export VAR', a następnie 'VAR =" myVar "', w przeciwnym razie nie działałby – cafonso

+0

To działało dla mnie, ale użyłem '/ etc/profiles.d/myproject.sh' (na Ubuntu Raring). – willoller

+1

Na moim systemie (Ubuntu 16.04LTS) musiałem połączyć wyciągi eksportowe w/etc/environment w następujący sposób: 'export MY_VAR = 'foo'' –

-5

myślę, że można używać tylko ustawić zmienną środowiskową z .htaccess:

SetEnv mohammad hello 

PHP:

print $_SERVER["mohammad"]; 
+0

Czy przeczytałeś pytanie? OP wie, jak ustawić zmienne env. –

1

na Ubuntu, PHP używa różnych plików INI do regularnych i CLI procesów.

Powinno być kilka plików ini, takich jak /etc/php5/cli/php.ini, /etc/php5/fpm/php.ini lub /etc/php5/php.ini. Otwórz plik INI związane i zmienić linię do

variables_order = "EGPCS"

variables_order = "GPCS"

.

Następnie otrzymasz zmienne środowiskowe, które ustawiłeś przed użyciem $ _ENV ["nazwa_zmiennej"].

Od php.ini o variables_order:

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. 

Więc można spróbować użyć getenv() zamiast $ _ENV [].

+1

Jestem świadomy dwóch różnych plików php.ini na Ubuntu. Oba mają ustawioną kolejność zmiennych na "GPCS". Dodanie 'E' nie pomoże mi tutaj ... ponieważ nie mam problemu z systemem (ubuntu) env vars nie jest w $ _ENV, ale nie jest załadowany do PHP w ogóle, co oznacza, że ​​nie ma ich w superglobach, ani $ GLOBALS, ani $ _SERVER, ani $ _ENV. Aby mieć 100% pewności, dodam "E" i sprawdzę. – rock3t

+0

Zgodnie z oczekiwaniami: zmienne/etc/environment nie są ładowane do globów PHP podczas używania SAPI jako apache2handler. – rock3t

+0

Użyłem 'php -i' do sprawdzenia, który plik' php.ini' się ładuje. Zmiana 'variables_order' nie działa. 'php -i' nadal zgłasza' GPCS'. – mzedeler

0

Ostatnio napisałem bibliotekę, aby uzyskać wartości z otoczenia zmienne i parsowanie na typy danych PHP. Ta biblioteka może być używana do analizowania zmiennych środowiskowych do typów danych PHP (takich jak casting to integer, float, null, boolean), analizowania złożonych struktur danych, takich jak ciąg JSON i więcej, z udziałem społeczności.

Biblioteka jest dostępna tutaj: https://github.com/jpcercal/environment

Umieść swoje zmienne środowiskowe w "/ etc/environment" i "/ etc/apache2/envvars", po ponownym uruchomieniu Apache Server i załadować zmiennych środowiskowych do systemu operacyjnego:

# source /etc/environment 
# source /etc/apache2/envvars 

i aby uzyskać wartości od zmiennej środowiskowej (niezależnie od środowiska CLI, Apache, Nginx, PHP wbudowany serwer i więcej), aby to zrobić:

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

Ciesz się tym.

Powiązane problemy