El fichero de configuración

El fichero de configuración (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.

El php.ini se busca en estos lugares (y en este orden) :

  • El lugar específico del módulo SAPI (la directiva PHPIniDir de Apache 2, la opción de la línea de comandos -c en CGI y en CLI)
  • La variable de entorno PHPRC.
  • El lugar donde se encuentra el fichero php.ini puede ser definido para diferentes versiones de PHP. La raíz de las claves de registro depende de la arquitectura de 32 o 64 bits del SO y de PHP. Para un SO y PHP de 32 bits o un SO y PHP de 64 bits, utilizar [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] para PHP de 32 bits en un SO de 64 bits, utilizar [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP] en su lugar. Para una instalación con la misma arquitectura, las siguientes claves de registro se buscan en este orden : [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] y [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], donde x, y y z significan las versiones mayores, menores y normales. Para una arquitectura de 32 bits de PHP en un SO de 64 bits, las siguientes claves de registro se buscan en este orden : [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] y [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x], donde x, y y z significan las versiones mayores, menores y normales. Si hay un valor para IniFilePath en estas claves, el primero encontrado será utilizado como el lugar donde se encuentra el fichero php.ini (solo en Windows).
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] o [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP], valor de IniFilePath (solo en Windows).
  • El directorio de trabajo actual (excepto para CLI)
  • El directorio del servidor web (para los módulos SAPI), o el directorio que contiene PHP (de otro modo en Windows)
  • El directorio Windows (C:\windows o C:\winnt) (para Windows), o la opción de compilación --with-config-file-path durante la compilación

Si el fichero php-SAPI.ini existe (donde SAPI utiliza SAPI, por lo que el nombre del fichero es e.g. php-cli.ini o php-apache.ini), se utilizará en lugar de php.ini. El nombre SAPI puede ser determinado utilizando la función php_sapi_name().

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.

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 ";" 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
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".

Leer un directorio

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.
add a note

User Contributed Notes 3 notes

up
22
weili
3 years ago
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.
up
5
Pictor13
1 year ago
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.
up
0
inakma87 at gmail dot com
1 month ago
The same behavior with `error_reporting` as Pictor13 pointed out.

I found a solution, to specify `error_reporting` in a numeric version.

php.ini
`error_reporting = ${ERROR_REPORTING}`

.env
`ERROR_REPORTING=24575`

24575 means `E_ALL & ~E_DEPRECATED`

PS: with the help of googling you can find "calculator of numeric values ​​for error_reporting"
To Top