Sobrescrevendo as configurações do php.ini com Apache e .htaccess

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Conceito

Parte deste artigo foi baseado neste capítulo do manual.

Nem sempre você pode (ou quer) definir diretivas do PHP em cada arquivo seu utilizando a função ini_set(). Muitas vezes é necessário estabelecer diretivas que se restrinjam a apenas alguns diretórios, e é aí que entra o Apache.

Com o .htaccess você pode sobreescrever diretivas do PHP direto pelo Apache. É importante observer que o PHP deve estar rodando como um módulo.

Uma coisa que você precisa saber antes de começar é se você possui os privilégios AllowOverride Options ou AllowOverride All.

Mão na massa

Com o PHP rodando como módulo, você pode estipular a mudança de diretivas através do httpd.conf ou .htaccess. Geralmente, nas hospedagens compartilhadas, só se tem acesso ao .htaccess mesmo…

Existem várias diretivas que podem ser alteradas. Você pode conferir a lista no Apêndice Diretivas do arquivo php.ini do manual do PHP. Neste apêndice você também confere quais diretivas são do tipo PHP_INI_ALL, PHP_INI_PERDIR e PHP_INI_SYSTEM.

Vejamos então quais são os comandos que podemos utilizar no nosso .htaccess.

[sourcecode]php_value nome valor[/sourcecode]

Para alterar valores não booleanos, devemos utilizar o comando php_value. Ele pode ser usado apenas com diretivas do tipo PHP_INI_ALL e PHP_INI_PERDIR. Para limpar um valor configurado anteriormente, use o valor none.

[sourcecode]php_flag nome on|off[/sourcecode]

Para alterar valores booleanos, se usa php_flag.
Pode ser usada apenas com diretivas do tipo PHP_INI_ALL e PHP_INI_PERDIR.

[sourcecode]php_admin_value nome valor[/sourcecode]

Este comando não pode ser usado com o .htaccess, apenas no httpd.conf.
Assim como php_value, só pode ser usado para valores não booleanos.

[sourcecode]php_admin_flag nome on|off[/sourcecode]

Mesma coisa que o acima, porém para valores booleanos.

Cuidado!

As constantes do PHP só existem no PHP, ou seja, se você utilizar constantes como E_ALL ou E_NOTICE para configurar a diretiva error_reporting, você terá um erro, pois o valor não será identificado e será substituído por false. Para resolver este problema, utilize os valores bitmask destas contantes! ;)

Mudando configuração do PHP através do registro do Windows

Com o PHP rodando no Windows é possível estabelecer configurações para cada diretório através do registro. Todos os valores de configuração ficam na chave HKLM\SOFTWARE\PHP\Per Directory Values, nas sub-chaves correspondentes aos caminhos dos diretórios.

Digamos que você tenha o diretório c:/inetpub/wwwroot. Todos os valores deste diretório devem ser guardados na chave HKLM/SOFTWARE/PHP/Per Directory Values\c\inetpub\wwwroot.

Os valores na chave devem ter o nome da diretiva de configuração do PHP e um valor string, assim como no último caso, constantes do PHP não valem aqui. Entretanto, apenas valores de configurações modificáveis no PHP_INI_USER podem ser definidos desta maneira, valores PHP_INI_PERDIR não podem.

Modo clássico!

Enfim… Pra fechar este artigo, vamos fugir um pouco do tópico geral e falar do ini_set(). É sempre bom você utiliza-lo se quiser modificar as diretivas diretamente do PHP ou se você não possui outro jeito de fazê-lo.

[sourcecode]string ini_set(string $varname, string $newvalue)[/sourcecode]

Se quiser, entre no manual do php, no capítulo do ini_set() e veja que é bem simples de usar! :D

Conclusão

Concluímos, portanto, que não é mistério sobreescrever as configurações, mas sempre haverá um admin malvado que irá bloquear…

Portanto… Acho interessante você também dar uma lida em alguns artigos sobre oratória, pra criar uma certa lábia e conseguir convencê-los a abrir uma exceção!

Um grande abraço e fiquem com Deus!