Configurações do PHP

Artigo que explica os conceitos envolvidos na configuração do PHP, seja via configuração do Apache, .htaccess, php.ini, ou pelas configurações via ini_set, em tempo de execução.

Introdução

PHP é uma linguagem interpretada que permite que sejam configuradas várias diretivas, tanto do core da linguagem quanto das suas extensões. A lista com todas as diretivas da linguagem são mostradas no manual.

Cada diretiva possui um "modo de mudança", que define onde e quando ela pode ser modificada. Por exemplo, algumas só podem ser definidas no arquivo de configurações gerenciado pelo administrador do servidor, por questões de segurança, enquanto outras podem ser alteradas pelo programador na própria aplicação.

Os modos de mudança das diretivas são:

  • PHP_INI_USER - Pode ser modificada com a função ini_set, arquivo .user.ini ou no Registro do Windows.
  • PHP_INI_PERDIR - Pode ser modificada no arquivo php.ini, .htaccess, httpd.conf ou .user.ini.
  • PHP_INI_SYSTEM - Pode ser modificada no arquivo php.ini ou httpd.conf.
  • PHP_INI_ALL - Pode ser modificada em qualquer lugar.

Observação: algumas diretivas pertenciam a um modo de mudança até determinada versão do PHP, mas mudaram para outro modo em outra versão do PHP. Estas informações são apresentadas na lista de diretivas da linguagem.


Arquivos de configuração (php.ini)

php.ini

As configurações padrão do PHP são definidas em arquivos "ini", que possuem a sintaxe bem simples baseada em chave/valor. Elas são carregadas assim que um script inicia a execução, mas os valores podem ser guardados em cache e re-carregados periodicamente por questões de performance.

O nome do arquivo pode variar de acordo com a sapi utilizada. Por exemplo, o arquivo padrão é o php.ini, mas se você executa a sapi CLI (PHP no terminal de comandos), é procurado o arquivo php-cli.ini e, caso este não seja encontrado, usa-se o arquivo padrão.

Estes arquivos ficam num diretório de configurações do servidor (no Linux normalmente ficam no diretório "/etc/", embora este local possa ser modificado durante a compilação do PHP ou com algumas alternativas, embora não seja comum). Normalmente apenas o administrador do servidor tem acesso a estes arquivos para mudanças, por questões de segurança. Isso é especialmente útil em servidores de provedores de hospedagem, em que os scripts de um domínio não podem interferir nos de outro.

Configurações pelo Programador

Existem basicamente 3 formas do programador sobrescrever as configurações do PHP: através da função ini_set (em tempo de execução), do arquivo .htaccess (caso use servidor Apache) ou do arquivo .user.ini (uma alternativa criada no PHP 5.3). Note que, nestes casos, o comportamento é modificado especificamente para um script ou conjunto de scripts e não a todos os arquivos PHP, como ocorre com o arquivo php.ini.


Usando a função ini_set, basta especificar dois parâmetros: o primeiro é o nome da diretiva e o segundo é o valor que deseja aplicar a ela (na forma de string). Para obter o valor atual da diretiva, existe a função ini_get (basta informar o nome da diretiva). Para obter o valor de todas diretivas, ou de todas diretivas de uma extensão, existe a função ini_get_all. E para retornar o valor da diretiva para o seu valor inicial (quando iniciou o script), basta usar a função ini_restore informando qual diretiva deve ser restaurada. Exemplo:

ini_set('memory_limit', '128M');
ini_set('display_errors', '0');

Usar o arquivo .htaccess é permitido para servidores Apache em que o PHP esteja sendo usado como módulo. O Apache precisa estar devidamente configurados para aceitar este tipo de arquivo no diretório da aplicação. Neste caso, uma diretiva pode ser definida utilizando duas sintaxes. Uma para definir valores não booleanos e outra para definir valores booleanos (que podem assumir "on" ou "off"), conforme os exemplos:

php_value memory_limit 128M
php_flag display_errors off

Observação: no arquivo httpd.conf as diretivas podem ser modificadas com php_admin_value e php_admin_flag. Isso pode ser útil para aplicar configurações diferentes para diretórios diferentes (ou hosts virtuais diferentes).


Usar o arquivo .user.ini é uma alternativa para o arquivo .htaccess, e foi incorporado ao PHP na versão 5.3. Por enquanto, ele só pode ser usado pelas sapis CGI ou Fast CGI. A sintaxe usada nestes arquivos é idêntica a usada no arquivo php.ini.

O nome do arquivo usado para este tipo de configuração (".user.ini") pode ser modificado no arquivo php.ini através da diretiva user_ini.filename. Isso normalmente é necessário quando a aplicação já utiliza este nome para outra finalidade.

Observação: recomenda-se esconder o acesso a este arquivo, assim como (normalmente) é feito com o .htaccess para prevenir que ele possa ser lido por qualquer usuário que acessa o sistema.


Configurações úteis de se conhecer

  • display_errors e display_startup_errors - Indica se os erros devem ser exibidos ou omitidos (normalmente "on" no ambiente de desenvolvimento e "off" no ambiente de produção).
  • log_errors - Indica se os erros devem ser registrados em um arquivo de log (normalmente "off", quando "display_errors" está "on", e vice-versa).
  • report_memleaks - Indica se os estouros de memória devem ser mostrados/registrados em log (normalmente "on").
  • memory_limit - Quantidade de memória reservada para o PHP durante a execução do script. Normalmente um script simples não precisa de mais de 10M, mas alguns exigem muito mais que isso. A diretiva deve ser configurada com um valor razoável para a aplicação e expandida, em casos de ferramentas que exigem mais memória. Para avaliar o uso de memória, veja as funções memory_get_peak_usage e memory_get_usage.
  • max_execution_time - Define o tempo máximo que o script pode ser executado antes de ser abortado automaticamente pelo PHP (normalmente "30", mas pode ser configurado com valores maiores para ferramentas mais pesadas).
  • precision - Define a precisão de casas decimais para números reais (normalmente 14).
  • date.timezone - Define o timezone padrão da aplicação (por exemplo "America/Sao_Paulo")
  • default_mimetype - Define o mimetype dos arquivos gerados pelo PHP que não deixaram explícitos com a chamada à header('Content-type: ...') (por exemplo: "text/html" ou "application/xhtml+xml").
  • default_charset - Define o charset padrão dos arquivos gerados pelo PHP que não deixaram explícitos com a chamada à header('Content-type: ...; charset=...').
  • short_open_tag - Define se a aplicação aceitará a notação abreviada de tags PHP: "<?" e "?>" (recomenda-se "on" apenas em aplicações fechadas, cuja portabilidade não é importante).
  • aps_tags - Define se a aplicação aceitará a notação ASP para tags PHP "<%" e "%>" (recomenda-se "on" apenas em aplicações fechadas, cuja portabilidade não é importante).
  • register_globals - Define se a aplicação criará variáveis globais para valores oriundos de EGPCS (Environment, GET, POST, Cookies e Server). Recomenda-se fortemente usar "off", pois é um recurso depreciado e que torna a aplicação mais propícia a falhas de segurança.
  • magic_quotes_runtime e magic_quotes_gpc - Define se será aplicada a função addslashes automaticamente sobre os dados submetidos. Recomenda-se fortemente usar "off", pois é um recurso depreciado e que caracteriza um comportamento inconveniente.
  • arg_separator.output - Separador padrão usado por funções do PHP que constroem URL. Recomenda-se "&amp;", especialmente para aplicações XHTML).
  • session.auto_start - Iniciar a sessão automaticamente (normalmente "off")
  • session.use_cookies - Indica se as sessões podem usar cookies para guardar as chaves de sessão (recomenda-se "on").
  • session.use_only_cookies - Indica se as sessões só podem usar cookies para trafegar as chaves de sessão, ao invés de informá-las via GET (recomenda-se fortemente "on", por questões de segurança).
  • session.use_trans_sid - Indica se as sessões podem usar o mecanismo de "transparent sid" para trafegar as chaves de sessão (dados passados por GET) (recomenda-se fortemente "off", por questões de segurança).

17 comentários

Anônimo disse...

Ola sou aprendiz de php e estou tendo dificuldades
na configuração do .htaccess,
estou utilizando PHP 5.3.10
e não estou conseguindo utilizar arrays em imagens, da o erro de 403 ou 404 sem acesso ao caminho ou objeto não encontrado.
As minhas imagens não estão sendo carregadas
(tentei utilizar a biblioteca ADODB) e tambem não tive sucesso

rubS (autor do blog) disse...

Olá Anônimo,

Não consegui entender o que você está tentando e o que está ocorrendo. Como assim "arrays em imagens". Por acaso seria "arrays de imagens"?

Você está tentando buscar imagens do BD e apresentá-las ao usuário? Se for isso, recomendo que dê uma lida neste outro artigo aqui do blog:

http://rubsphp.blogspot.com.br/2011/03/gravando-arquivos-em-bd.html

Qualquer dúvida é só comentar.

Anônimo disse...

Olá Rubens

Olá Rubens
Antes de tudo quero te parabenizar por este ótimo artigo, e pela resposta rápida.
É exatamente isso mesmo.
Fiz um código que insere a imagem no banco de dados, a imagem é salva em um diretório e o nome da imagem fica registrado no banco de dados.
Estou conseguindo trazer todas as demais informações do banco de dado, mas não estou conseguindo trazer as imagens.
A imagem não carrega e não aparece sinal de erro algum, fui analisar o logs de erro do apache
E me veio o seguinte erro:
[error] [client 127.0.0.1] File does not exist: C:/wamp/www/CC_1/imagens/ 300x200_17.png, referer: http://localhost/CC_1/inicioo.php?codcategoria=11&acao=listar_produtos.
Caso de para você me der uma força lhe agradeço muito mesmo.

rubS (autor do blog) disse...

Pelo erro do apache, eu iria sugerir que lesse cuidadosamente (caractere por caractere) o caminho do arquivo que não foi encontrado. Pode ser uma letrinha errada e já impede o php de achar a imagem. Vá no diretório e confira se a imagem está sendo salva com o nome correto também.

Anônimo disse...

Rubéns

Muito obrigado pela dica
e muito obrigado pela atenção estarei analizando o codigo

Marcos Shindler disse...

Olá Rubens tudo bem ???
Precisaria de sua ajuda em php.
Possuo hospedagem num servidor americano. Lá a hospedagem está em fuso horario do pacifico. Já pedi para os administradores mudarem e não obtive resultado. Tentei usar o arquivo .htaccess com a linha SetEnv TZ America/sao paulo e não obtive resultado. Teria outro metodo pata alterar o fuso horario quando não se tem acesso ao arquivo php.ini do servidor ???

Obs* Sei que não tem erro no meu script, pois já utilizei hospedagem no Brasil e o script funcionava corretamente.

Obrigado pela atenção e se possível uma ajuda.

Att: Marcos

Rubens Takiguti Ribeiro (autor do blog) disse...

Olá, Marcos
Para saber onde você pode modificar a diretiva "data.timezone", primeiro você precisa acessar este link:
http://www.php.net/manual/en/ini.list.php

E então encontrar o tipo de escopo em que a diretiva pode ser modificada. No caso, o tipo de escopo é o PHP_INI_ALL, o que significa que você pode modificá-la inclusive em tempo de execução do script, através da função ini_set. Então, basta você executar a linha abaixo para obter o que precisa:

ini_set('date.timezone', 'America/Sao_Paulo');

Adriano Figueiredo disse...

Olá Rubens, tudo bem?
Sou um aprendiz em PHP..., e estou com algumas dúvidas em relação à configuração de algumas diretivas do php.ini em tempo de execução.

É o seguinte:
no php.ini a diretiva display_errors está definida como Off.
Visto que a directiva display_errors tem o modo de mudança PHP_INI_ALL (modificada em qualquer lugar) porque razão é que não estou a conseguir modificar a directiva display_errors através do seguinte script php?



Estou a usar o seguinte ambiente:
Os X 10.9.1
Apache 2.2.24
PHP 5.4.17

Será que me podes ajudar a perceber está situação?


Rubens Takiguti Ribeiro (autor do blog) disse...

Adriano,

A diretiva display_errors define se os erros serão mostrados ou não. Mas para especificar quais tipos de erros são mostrados, você também precisa usar a função error_reporting.
http://br1.php.net/manual/en/function.error-reporting.php

Experimente definir o valor de display_errors e error_reporting, depois vê se foram definidas com sucesso:

// Mostrando o valor de display_errors
var_dump(ini_get('display_errors'));

// Definindo o valor de display_errors e error_reporting
ini_set('display_errors', 'on');
error_reporting(E_ALL);

// Mostrando o novo valor de display_errors
var_dump(ini_get('display_errors'));

Adriano Figueiredo disse...

Olá Rubens, antes de mais agradeço a tua disponibilidade.
Seguindo o teu exemplo, posso dizer que as directivas display_errors e error_reporting estão a ser definidas em tempo de execução ;) . No entanto, se aceder ao seguinte ficheiro.php:





os erros não são apresentados no browser (a tela fica completamente vazia/branca) e a execução do script é encerrada/anulada!

Se respectivas diretivas estão a ser configuradas em tempo de execução... por é que os erros não aparecem (tendo em conta o script anterior)? Mesmo com as definições em tempo de execução..., as diretivas devem ser ativadas no php.ini (impedindo que a tela fique vazia/branca) ?

No entanto, por motivos de segurança estas directivas devem ser desativadas... correto?

E é aqui que entram os seguintes termos: Sistema de Desenvolvimento e Sistemas de Produção (ex. sistemas conectados à internet).

No Sistema de Desenvolvimento, a diretiva display_errors no php.ini deve estar ativa/On (impedindo que a tela fique vazia/branca)
No Sistema de Produção a diretiva display_errors no php.ini deve estar inativa/Off

Agradeço a tua disponibilidade.
AF









Rubens Takiguti Ribeiro (autor do blog) disse...

Olá, Adriano
Não consigo ver o código que você postou, pois o blogger não permite colocar o sinal de menor nos comentários.

No entanto, se a tela fica branca, pode ser um erro de sintaxe do script. Experimente executar na linha de comando:
$ php -l script.php

E veja se é mostrada a mensagem de que não foram encontrados erros de sintaxe.

Sobre as diferenças entre ambiente de desenvolvimento e ambiente de produção, você está correto em partes.

Na verdade, o que se costuma fazer é o seguinte:

DESENVOLVIMENTO:
* display_errors = on (mostrar erros na tela)
* log_errors = on (mostrar erros nos logs)
* error_reporting = E_ALL (capturar todos os erros)

PRODUÇÂO
* display_errors = off (não mostrar erros na tela)
* log_errors = on (mostrar erros nos logs)
* error_reporting = E_ALL (capturar todos os erros) ou então E_ALL ^ E_NOTICE (capturar erros, exceto notices)

Ou seja, error_reporting só diz quais erros serão capturados. E com display_errors e log_errors você controla para onde estes erros capturados devem ir (se vão ser exibidos na tela e/ou se vão ser armazenados no arquivo de log).

Adriano Figueiredo disse...

aqui vai o script.php:


// Mostrando o valor de display_errors
var_dump(ini_get('display_errors'));
// Mostrando o valor de error_reporting
var_dump(ini_get('error_reporting'));


// Definindo o valor de display_errors e error_reporting
ini_set('display_errors', 'on'); //se os erros serão mostrados ou não...
error_reporting(E_ALL); //todo o tipo de erros.

// Mostrando o novo valor de display_errors
var_dump(ini_get('display_errors'));

// Mostrando o novo valor de error_reporting
var_dump(ini_get('error_reporting'));

//erro intencional
::

Adriano Figueiredo disse...

resultado da execução do script.php na linha de comandos:
$ php -l script.php
PHP Parse error: parse error in error.php on line 20
Errors parsing script.php

Rubens Takiguti Ribeiro (autor do blog) disse...

Adriano, você colocou "::" literalmente no código, para simular um erro intencional?

Isso caracteriza um erro de sintaxe no script e ele nem chega a ser interpretado.

Note que para executar um script PHP, primeiro o interpretador precisa interpretar TODO o código, transformá-lo em código intermediário e só depois executá-lo. Portanto, se há um erro de sintaxe, o script nem chega a ser executado, pois não consegue construir o código intermediário.

Você pode simular um erro chamando uma função com nome que não existe. Neste caso, a sintaxe do script estará correta e o PHP só vai detectar que há um erro fatal quando executar a linha com a chamada da função inexistente.

Ou seja, há erros que são detectáveis em tempo de interpretação do código (erros de sintaxe) e os erros que são detectáveis em tempo de execução (erros de lógica). O PHP só vai conseguir mostrar erro se for um erro de lógica. Porém, vai mostrar o erro no arquivo de log (caso configurado adequadamente).

Adriano Figueiredo disse...

Rubens, agradeço a tua disponibilidade.
É com estas atitude que a Internet se trona numa das melhores plataformas de estudo.
Acredita que vou passar a referenciar o teu Blog. Continua assim!
Um abraço,
AF