web-dev-qa-db-fra.com

Comment obtenir des variables d'environnement système dans PHP lors de l'exécution de CLI & Apache2Handler?

Mon système est Ubuntu et j'ai défini mes variables d'environnement dans /etc/environment.

Si j'exécutePHPscript en utilisantCLI-, les variables d'environnement de /etc/environment sont reconnues.

Mais, si je vais exécuterPHPscript via http://domain/test.php (c'est-à-dire Apache2handler ), le même script affiche NULL, ce qui signifie que les variables d'environnement de /etc/environment ne sont pas chargées.

Le correctif que j'ai fait a été d'ajouter des variables dans /etc/Apache2/envvars et cela a résolu le problème.

Mais ce sont deux fichiers différents, qui doivent ensuite être synchronisés.

Comment créerPHP/ Apache charger et reconnaître les variables d'environnement à partir de /etc/environment (système)?

EDIT: Pour clarifier les choses, quand je dis 'non chargé dans PHP', cela signifie que les variables de /etc/environment ne sont pas définies dans $_SERVER, $_ENV, getenv() et n'existent pas dans $GLOBALS. En d'autres termes, "ne sont pas chargés dans PHP".

37
rock3t

J'ai eu exactement le même problème. Pour le résoudre, je viens de chercher /etc/environment dans /etc/Apache2/envvars.

Le contenu de /etc/environment:

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

Le contenu de /etc/Apache2/envvars:

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

Maintenant, je peux utiliser ces variables dans les fichiers de configuration Apache Virtual Host et en PHP.

Voici un exemple d’hôte virtuel 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>

Et voici un exemple montrant comment y accéder avec 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";
?>
53
Patrick Janser

Sur Ubuntu, PHP utilise différents fichiers ini pour les processus standard et CLI.

Il devrait y avoir quelques fichiers ini comme /etc/php5/cli/php.ini, /etc/php5/fpm/php.ini ou /etc/php5/php.ini. Ouvrez le fichier INI associé et modifiez le

variables_order = "GPCS"

ligne à

variables_order = "EGPCS".

Après cela, vous obtiendrez les variables d’environnement que vous avez définies avant d’utiliser $ _ENV ['varname'].

De php.ini à propos de 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.

Vous pouvez donc essayer d’utiliser getenv () au lieu de $ _ENV [].

1
edigu

Récemment, j'ai écrit une bibliothèque pour obtenir les valeurs des variables d'environnement et les analyser avec les types de données PHP. Cette bibliothèque peut être utilisée pour analyser les variables d’environnement en types de données PHP (comme la conversion en entier, float, null, boolean), analyser les structures de données complexes comme une chaîne JSON et plus encore avec la contribution de la communauté.

La bibliothèque est disponible ici: https://github.com/jpcercal/environment

Mettez vos variables d’environnement dans "/ etc/environment" et "/ etc/Apache2/envvars", après avoir redémarré votre serveur Apache et chargé vos variables d’environnement dans le système opérationnel:

# source /etc/environment
# source /etc/Apache2/envvars

Et pour obtenir les valeurs de la variable d’environnement (indépendamment de l’environnement CLI, Apache, Nginx, PHP serveur intégré, etc.), procédez comme suit:

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

Profitez-en.

0