Usando variáveis de ambiente env no PHP
Uma das questões enfrentadas no desenvolvimento de software é como armazenar as informações de configuração de uma aplicação. Essas configurações podem conter informações sensíveis como senhas, salts, tokens, chaves privadas entre outras.
Colocar estas informações diretamente no código não é uma opção interessante, primeiro torna a alteração mais complicada e segundo é muito mais fácil cometer um erro e comprometer estes dados. Se você não fez, deve ter ouvido histórias de alguém que adicionou junto do código sua senha em um repositório publico no github?
Uma alternativa muito popular é a utilização de variáveis de ambiente. Uma variável de ambiente não é diferente de uma variável do nosso programa mas ao invés de estar dentro do nosso programa ela esta no sistema operacional. Você já teve ter tido contato com ela, vários programas para serem utilizados no terminal do windows pedem que você configure o PATH, bom o PATH é uma variável de ambiente.
Para configurar uma variável de ambiente no terminal podemos utilizar o seguinte comando:
// no linux
export APP_ENV=local
// no windows/prompt
set APP_ENV="local"
Para visualizar uma variável já configurada:
// no linux
echo $APP_ENV
// no windows/prompt
echo %APP_ENV%
*Note que as variáveis configuradas assim só existem no próprio terminal em que foram criadas enquanto esse está aberto. Para um armazenamento mais duradouro cada sistema operacional tem seu caminho.
Lendo Valores de variáveis de ambiente
Agora que temos valores para serem lidos nas variáveis de ambiente vamos utilizar o PHP para lê-las. Primeiro temos duas formas através do array $_ENV
ou da função getenv()
.
O $_ENV
é um array associativo onde cada uma das suas chaves é uma variável de ambiente apontando para o seu valor. O problema é que ele pode não ser carregado dependendo da configuração do php.ini. Para habilitá-lo deve-se colocar opção “E” na diretiva “variables_order” em que cada letra representa uma super global a ser carregada.
Para ler o valor através do $_ENV
é simples:
<?php
$valor = $_ENV['APP_ENV'];
Outra forma é através da função getenv()
que recebe o nome do variável de ambiente como parâmetro e retorna seu valor.
<?php
$valor = getenv('APP_ENV');
Podemos adicionar uma variável de ambiente para a requisição atual através da função putenv('APP_ENV=local')
. Mas frisando ela só irá ser acessada na requisição atual e pela função getenv()
, não interferindo no $_ENV
.
Carregando variáveis de ambiente de arquivos env
Em muitos casos pode ser trabalhoso ou inviável ficar criando as variáveis de ambiente diretamente no terminal, então um prática que se tem adotado muito é coloca-los em um arquivo que será carregado pelo aplicação.
No PHP podemos utilizar uma biblioteca chamada PHPDotEnv. Para instalá-la utilizamos o composer.
composer require vlucas/phpdotenv
Após criamos o arquivo .env
APP_ENV=local
NOME="Rodrigo Aramburu"
SENHA=senhasegura
Agora carregamos o arquivo
<?php
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createUnsafeImmutable(__DIR__);
$dotenv->load();
echo getenv('APP_ENV')."\n";
echo getenv('NOME')."\n";
echo getenv('SENHA')."\n";
Primeiro criamos um objeto Dotenv
através de um método passando para ele o diretório onde se encontra o arquivo .env
, no nosso caso utilizamos a constante __DIR__
que contem o diretório atual. Logo após basta chamar o método load()
.
Note que utilizamos getenv()
para ler as variáveis de ambiente e não $_ENV
, fizemos isso pois utilizamos o Dotenv\Dotenv::createUnsafeImmutable($dir)
para carregar os valores, o que os carrega somente no contexto do getenv
que não é thread safe. Para utilizarmos o $_ENV
podemos carregar utilizando Dotenv\Dotenv::createImmutable($dir)
.
*AVISO IMPORTANTE: Ao utilizar arquivos .env
não os inclua no seu gerenciador de versões(como git) pois ele normalmente vai conter informações sensíveis e seu conteúdo pode ser publicado em um repositório publico. Para isso basta adicionar .env
dentro de seu arquivo .gitignore
. Uma prática comum é criar um arquivo .env.example
com valores de falso de exemplo que sua aplicação necessita e este sim ser adicionado no gerenciador de versão.
Outra ponto importante é nunca deixe os arquivos .env
em um diretório que pode ser acessível via url, se não for possível colocar fora do diretório publico da sua hospedagem você pode bloqueá-lo utilizando o .htaccess
com o seguinte código.
<Files .env>
Order allow,deny
Deny from all
</Files>
Bom era isso, espero ter servido para alguma coisa, T++.