How to get system environment variables into PHP while running CLI & Apache2Handler?
I had exactly the same problem. To solve it, I just sourced /etc/environment
inside /etc/apache2/envvars
.
The content of /etc/environment
:
export MY_PROJECT_PATH=/var/www/my-project
export MY_PROJECT_ENV=production
export [email protected]
The content of /etc/apache2/envvars
:
# Load all the system environment variables.
. /etc/environment
Now, I'm able to use these variables in the Apache Virtual Host config files and in PHP.
Here's an example of an Apache virtual host:
<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>
And this is an example of how to access them with 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";
?>
On ubuntu, PHP uses different ini files for regular and CLI processes.
There should be few ini files like /etc/php5/cli/php.ini
, /etc/php5/fpm/php.ini
or /etc/php5/php.ini
. Open related INI file and change the
variables_order = "GPCS"
line to
variables_order = "EGPCS"
.
After that, you would get the environment variables which you set before using $_ENV['varname'].
From php.ini about 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.
So you can try to use getenv() instead of $_ENV[].