How to get system environment variables into PHP while running CLI & Apache2Handler?

前端 未结 4 509
梦如初夏
梦如初夏 2020-11-28 05:13

My system is Ubuntu and I have set my environment variables in /etc/environment.

If I\'m running PHP script using

相关标签:
4条回答
  • 2020-11-28 05:54

    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[].

    0 讨论(0)
  • 2020-11-28 06:02

    Recently i wrote a library to get values from environment variables and parse to the PHP data types. This library can be used to parse environment variables to PHP data types (like the casting to integer, float, null, boolean), parse the complex data structures like a JSON string and more with the contribution of the commnunity.

    The library is available here: https://github.com/jpcercal/environment

    Put your environment variables into "/etc/environment" and "/etc/apache2/envvars", after restart your Apache Server and load your environment variables to operational system:

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

    And to get the values from environment variable (independently of the environment CLI, Apache, Nginx, PHP Built-in Server and more) to do it:

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

    Enjoy it.

    0 讨论(0)
  • 2020-11-28 06:11

    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 MY_PROJECT_MAIL=support@my-project.com
    

    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";
    ?>
    
    0 讨论(0)
  • 2020-11-28 06:15

    i think you can only use to set an environment variable from .htaccess:

    SetEnv greet hello
    

    PHP:

    print $_SERVER["greet"];
    
    0 讨论(0)
提交回复
热议问题