For someone who's also wondering.
PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
O arquivo de configuração (php.ini) é lido quando o PHP inicia. Para as versões de módulo de servidor, isso acontece apenas quando o servidor web for iniciado. Para as versões CGI e CLI, isso acontece a cada invocação.
php.ini é procurado nesses lugares (na ordem):
PHPIniDir
no Apache 2, opção de linha de comando -c
no CGI e CLI)
php.ini
pode ser definida para versões diferentes do PHP. A raiz do registro depende da compilação em 32 ou 64 bits do sistema operacional (SO) e do PHP.
Para um PHP 32 bits em um SO de 32 bits ou um PHP de 64 bits em um SO de 64 bits use [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
, Para um PHP 32 bits em um SO de 64 bits use [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
].
Para sistema onde a compilação em bits coincida, as seguintes chaves
são examinadas, nessa ordem:
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]
e
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]
, onde
x, y e z significam os valores de versão PHP major, minor e release.
Para PHP versão 32 bits em um SO de 64 bits, as seguintes chaves são examinadas em ordem:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]
e
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]
, onde
x, y e z significam os valores de versão PHP major, minor e release.
Se houver um valor
para IniFilePath
nestas chaves, então o primeiro
encontrado será utilizado para a localização do php.ini
(apenas Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
ou
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
, valor de
IniFilePath
(Somente Windows).
--with-config-file-path
.
Se php-SAPI.ini existe (onde SAPI é o SAPI usado, então o nome de arquivo é, por exemplo, php-cli.ini ou php-apache.ini), é usado ao invés do arquivo php.ini. O nome SAPI pode ser determinado pela função php_sapi_name().
Nota:
O servidor web Apache muda o diretório para raiz durante a inicialização, causando com que o PHP tente ler o arquivo php.ini da raiz do arquivo de sistema, se ele existir.
O uso de variáveis de ambiente podem ser usadas no php.ini como mostrado abaixo.
Exemplo #1 php.ini Variáveis de ambiente
; PHP_MEMORY_LIMIT é lido das variáveis de ambiente memory_limit = ${PHP_MEMORY_LIMIT}
As diretivas do arquivo php.ini tratadas por extensões são documentadas nas respectivas páginas das próprias extensões. A lista de diretivas principais está disponível no apêndice. Nem todas as diretivas do PHP estão documentadas no manual. Para uma lista completa das diretivas disponíveis na sua versão do PHP, por favor leia seu arquivo php.ini. Alternativamente, você pode encontrar » a última versão do php.ini no Git, que também pode ser útil.
Exemplo #2 Exemplo de arquivo php.ini
; qualquer texto após um ponto e virgula nú (;) é ignorado [php] ; marcadores de sessão (textos dentro de colchetes) também são ignorados ; Valores booleanos podem ser: ; true, on, yes ; ou false, off, no, none register_globals = off track_errors = yes ; vocẽ pode organizar strings dentro de aspas include_path = ".:/usr/local/lib/php" ; contrabarra é tradado como um caracter normal include_path = ".;c:\php\lib"
É possível acessar as variáveis .ini
dentro dos arquivos .ini. Exemplo: open_basedir = ${open_basedir}
":/new/dir"
.
É possível configurar o PHP para procurar por arquivos .ini em um diretório após a leitura do php.ini. Isto é possível na compilação pela configuração da opção --with-config-file-scan-dir. No O diretório de configuração pode ser sobrescrito em tempo de execução através da configuração da variável de ambiente PHP_INI_SCAN_DIR.
É possível procurar em vários diretórios os separando com o
delimitador específico da plataforma (;
no Windows, NetWare
e RISC OS; :
em todas as outras plataformas; o PHP
utilizará a constante PATH_SEPARATOR
).
Se um diretório em branco estiver informado em PHP_INI_SCAN_DIR, o PHP
também procurará pelo diretório informado na diretiva de compilação
--with-config-file-scan-dir.
Dentro de cada diretório o PHP irá pesquisar todos os arquivos terminados em
.ini
em ordem alfabética. A lista de arquivos
é carregada, e nessa ordem são interpretados com uma chamada a
php_ini_scanned_files(), o por rodar o PHP com a opção
--ini.
Assumindo que o PHP foi configurado com --with-config-file-scan-dir=/etc/php.d, e o separador de caminho é :... $ php PHP irá carregar todos os arquivos de configuração em in /etc/php.d/*.ini. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php PHP irá carregar todos os arquivos de configuração em /usr/local/etc/php.d/*.ini. $ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php PHP irá carregar todos os arquivos de configuração em /etc/php.d/*.ini, e então em /usr/local/etc/php.d/*.ini. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php PHP irá carregar todos os arquivos de configuração em /usr/local/etc/php.d/*.ini, e então em /etc/php.d/*.ini.
For someone who's also wondering.
PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
Notice that `error_reporting` CANNOT be interpolated with an environment variable (e.g. `error_reporting = ${PHP_ERROR_REPORTING}`).
`error_reporting` is treated differently than other directives:
if assigned an environment variable, this will be silently ignored and replaced with value `0` (aka no-reporting).
I couldn't find documentation about it.
Is maybe an info that should be added in https://github.com/php/php-src/blob/8f5156fcba9906664ecd97e4c279ee980e522121/php.ini-production#L451-L500 ?
I am not aware if this specific behavior affects only `error_reporting` or also other directive.
I'm not sure why the comment saying you can use constants is downvoted so much. This is amazing news and just what I was looking for.
Having a configuration like:
php_admin_value[error_log] = "/logfolder/php-fpm-"PHP_VERSION".$pool.log"
will nicely log to /logfolder/php-fpm-8.3.10.mypool.log , which is really useful if you have multiple versions of PHP running and want to keep your log files separate and not have to fiddle with the configuration each time you update. A list of the pre-defined constants is here ( https://www.php.net/manual/en/reserved.constants.php#reserved.constants.core ) The PHP_*_VERSION, PHP_VERSION, PHP_OS_FAMILY, and maybe PHP_SAPI are useful in this case.
For anyone who wants to ignore any directory entirely
On a linux Redhat distro (this was on EL9):
; if using php-fpm, put this file in place"
/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
Environment="PHP_INI_SCAN_DIR="
; do a systemd config reload:
systemctl daemon-reload
; if you want to make sure php on the cli fails if it's not passing 'PHP_INI_SCAN_DIR= php' (this should also affect both linux normal+system users?) then drop this file in place:
cat /etc/php.d/00-dont-use-phpd.ini
auto_prepend_file=MISSING_ENV__PHP_INI_SCAN_DIR__SEE_ETC_PHPD_00_DONT_USE_PHPD_INI
; don't allow php.d directory to load in files
; you must pass 'PHP_INI_SCAN_DIR= ' before your php command on the cli
; reference:
; https://www.php.net/manual/en/configuration.file.php#configuration.file.scan