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.El fichero de configuración principal (php.ini) es leído por PHP al inicio. Si se ha compilado PHP como módulo, el fichero solo se lee una vez, al inicio del servidor web. Para las versiones CGI y CLI el fichero es leído en cada invocación.
PHP localiza el fichero de configuración principal de la siguiente manera:
Si el SAPI activo proporciona una ruta específica para php.ini, se
utiliza esa (por ejemplo, la directiva PHPIniDir de
Apache 2, o la opción de la línea de comandos -c en
CGI y CLI).
De lo contrario, PHP construye una ruta de búsqueda a partir de los siguientes lugares:
La variable de entorno PHPRC.
En Windows, la ruta configurada en el registro
(IniFilePath).
El directorio de trabajo actual, excepto para los SAPI que lo desactivan, como CLI.
Nota:
El servidor web Apache cambia este directorio al directorio root al inicio, lo que hace que PHP intente leer php.ini desde el sistema de ficheros raíz si existe.
El directorio del ejecutable de PHP o del módulo SAPI.
El directorio especificado por la opción de compilación
--with-config-file-path, o el directorio Windows
(C:\windows
o C:\winnt) en Windows.
A continuación, PHP busca php-SAPI.ini en esa ruta de búsqueda y, si no lo encuentra, busca php.ini. El nombre SAPI puede ser determinado utilizando la función php_sapi_name().
Después del paso del fichero de configuración principal, PHP puede
además leer los ficheros .ini presentes en la ruta
especificada por la variable de entorno
PHP_INI_SCAN_DIR o, si esta no está definida, por la
opción de compilación
--with-config-file-scan-dir.
En Windows, PHP puede obtener la ubicación del fichero de configuración
principal desde el registro mediante el valor IniFilePath.
Las claves de registro exactas que se examinan dependen de la versión de PHP y de si PHP y Windows son de 32 o de 64 bits.
Para un PHP de 32 bits en un SO de 32 bits, o un PHP de 64 bits en un SO de 64 bits, las siguientes claves de registro se examinan en este orden:
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
En estas claves, x, y y
z se refieren a las versiones mayor, menor y de
lanzamiento de PHP. Si alguna de estas claves contiene un valor
IniFilePath, se utiliza la primera encontrada.
Para un PHP de 32 bits en un SO de 64 bits, las siguientes claves de registro se examinan en este orden:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x.y.z]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x.y]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
Si alguna de estas claves contiene un valor IniFilePath,
se utiliza la primera encontrada.
Las variables de entorno pueden ser referenciadas en los valores de configuración de php.ini como se ilustra a continuación. A partir de PHP 8.3.0, un valor de repliegue puede ser especificado, que será utilizado cuando la variable referenciada no esté definida.
Ejemplo #1 Variables de entorno en php.ini
; PHP_MEMORY_LIMIT se toma desde el entorno
memory_limit = ${PHP_MEMORY_LIMIT}
; Si PHP_MAX_EXECUTION_TIME no está definido, tomará el valor de repliegue 30.
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Las directivas php.ini están directamente documentadas, por extensiones, en las páginas respectivas del manual de estas extensiones. La lista de directivas internas está disponible en el anexo. Es probable que no todas las directivas PHP estén documentadas en el manual. Para una lista completa de las directivas disponibles en su versión de PHP, lea los comentarios de su propio fichero php.ini. También se puede encontrar la » última versión del php.ini en Git.
Ejemplo #2 Extracto del php.ini
; todo texto en una línea, situado después de un punto y coma ";" sin comillas es ignorado [php] ; los marcadores de sección (texto entre corchetes) también son ignorados ; Los valores booleanos pueden ser especificados así : ; true, on, yes ; o false, off, no, none register_globals = off track_errors = yes ; se pueden colocar las cadenas de caracteres entre comillas dobles include_path = ".:/usr/local/lib/php" ; Las barras invertidas se tratan como cualquier carácter include_path = ".;c:\php\lib"
Es posible referirse a variables .ini
desde ficheros .ini. Por ejemplo : open_basedir = ${open_basedir}
":/new/dir".
Es posible configurar PHP para leer los ficheros .ini presentes en un directorio después de la lectura de php.ini. Esto se ajusta durante la compilación con el argumento --with-config-file-scan-dir. El directorio a leer puede ser modificado durante la ejecución por la definición de la variable de entorno PHP_INI_SCAN_DIR.
Es posible leer varios directorios separándolos con un
separador de ruta específico de la plataforma (; para Windows, NetWare
y RISC OS; : para todas las otras plataformas; el valor utilizado por PHP es
disponible en la constante PATH_SEPARATOR).
Si se proporciona un directorio vacío en
PHP_INI_SCAN_DIR, PHP
también leerá el directorio proporcionado durante la compilación a través de
--with-config-file-scan-dir.
En cada directorio, PHP leerá todos los ficheros que terminen por
.ini en orden alfabético. Una lista de los ficheros que
han sido cargados y en qué orden está disponible llamando a la función
php_ini_scanned_files(), o ejecutando PHP con la opción
--ini.
Suponiendo que PHP está configurado con --with-config-file-scan-dir=/etc/php.d, y que el separador de ruta es :... $ php PHP cargará todos los ficheros presentes en /etc/php.d/*.ini como fichero de configuración. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php PHP cargará todos los ficheros presentes en /usr/local/etc/php.d/*.ini como fichero de configuración. $ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php PHP cargará todos los ficheros presentes en /etc/php.d/*.ini, luego /usr/local/etc/php.d/*.ini como fichero de configuración. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php PHP cargará todos los ficheros presentes en /usr/local/etc/php.d/*.ini, luego en /etc/php.d/*.ini como fichero de configuración.
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.It is worth noting that $PHP_INI_SCAN_DIR is **not** recursive, which offers flexibility in organizing configuration in base-environment fashion:
$ mkdir -p /tmp/php_conf/prod /tmp/php_conf/dev
$ touch /tmp/php_conf/php.base.ini /tmp/php_conf/prod/php.ini /tmp/php_conf/dev/php.ini
$ export PHP_INI_SCAN_DIR="/tmp/php_conf:/tmp/php_conf/dev"
$ php --ini
//...
Scan for additional .ini files in: /tmp/php_conf:/tmp/php_conf/dev
Additional .ini files parsed: /tmp/php_conf/php.base.ini,
/tmp/php_conf/dev/php.ini
Such behavior can be used with docker where whole a subtree of configs is mounted into a dev-container, with ability to control which set of files is loaded using an environment variable.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.