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 (php.ini) es leído al arrancar PHP. En las versiones en que PHP funciona como módulo de servidor, esto sucede únicamente cuando se inicia el servidor. En las versiones CGI y CLI, esto ocurre en cada ejecución.
El fichero php.ini se busca en las siguientes ubicaciones (en orden):
PHPIniDir
en Apache 2, opción de línea de comandos -c
en CGI y CLI,
parámetro php_ini
en NSAPI,
variable de entorno PHP_INI_PATH
en THTTPD)
php.ini
para diferentes versiones de PHP. Se examinan
en orden las siguientes claves de registro:
[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 la versión mayor, menor, y de edición de PHP. Si existiera
un valor para IniFilePath
en cualquiera de estas claves, la primera en
ser encontrada se utilizaría como ubicación del fichero php.ini
(solo en Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
, valor de
IniFilePath
(solo en Windows).
--with-config-file-path
.
Si existiera el fichero php-SAPI.ini (donde SAPI es la SAPI en uso, por ejemplo, php-cli.ini o php-apache.ini), se usaría éste en lugar de php.ini. Se puede determinar el nombre de la SAPI usando php_sapi_name().
Nota:
El servidor web Apache cambia el directorio al raíz al arrancar, haciendo que PHP intente leer php.ini desde el sistema de ficheros raíz si existiera.
Las variables de entorno se pueden usar en php.ini como se muestra abajo.
Ejemplo #1 Variables de entorno de php.ini
; PHP_MEMORY_LIMIT se toma del entorno memory_limit = ${PHP_MEMORY_LIMIT}
Las directivas de php.ini manejadas por extensiones están documentadas en la propia página de cada extensión. Hay una lista de directivas del núcleo disponible en el apéndice. Es posible que no todas las directivas de PHP estén documentadas en el manual: para consultar una lista completa de las directivas disponibles en su versión de PHP, por favor, lea los comentarios del fichero php.ini. Adicionalmente, puede encontrar útil » el último php.ini desde Git.
Ejemplo #2 Ejemplo de php.ini
; todo texto en una línea tras un punto y coma sin comillas (;) será ignorado [php] ; los marcadores de sección (textos entre corchetes) también se ignoran ; Los valores de tipo boolean puede establecerse a: ; true, on, yes ; o false, off, no, none register_globals = off track_errors = yes ; se pueden encerrar los strings entre comillas dobles include_path = ".:/usr/local/lib/php" ; las barras invertidas reciben el mismo tratamiento que el resto de caracteres include_path = ".;c:\php\lib"
A partir de PHP 5.1.0, es posible hacer referencia a variables .ini ya existentes desde
el propio fichero .ini. Ejemplo: open_basedir = ${open_basedir}
":/new/dir"
.
Es posible configurar PHP para que busque ficheros .ini en un directorio después de leer php.ini. Esto se puede realizar durante la compilación estableciento la opción --with-config-file-scan-dir. En PHP 5.2.0 y posteriores, el directorio de búsqueda puede ser sobrescrito durante la ejecución estableciendo la vairable de entorno PHP_INI_SCAN_DIR.
Es posible buscar en varios directorios separándolos con el
separador de rutas específico de cada plataforma (;
en Windows, NetWare
y RISC OS; :
en las demás plataformas; el valor que PHP
emplea está disponible como la constante PATH_SEPARATOR
).
Si se proporciona a PHP_INI_SCAN_DIR un directorio en blanco, PHP
también buscará en el directorio dado durante la compilación mediante
--with-config-file-scan-dir.
PHP buscará dentro de cada directorio todos los ficheros que finalicen en
.ini
en orden alfabético. Se puede obtener una lista
de los ficheros cargados, y en qué orden, llamando a
php_ini_scanned_files(), o ejecutando PHP con la
opción --ini.
Se asumen que PHP está configurado con --with-config-file-scan-dir=/etc/php.d, y que el separador de rutas es :... $ php PHP cargará todos los ficheros de /etc/php.d/*.ini como ficheros de configuración. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php PHP cargará todos los ficheros de /usr/local/etc/php.d/*.ini como ficheros de configuración. $ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php PHP cargará todos los ficheros de /etc/php.d/*.ini, y luego de /usr/local/etc/php.d/*.ini como ficheros de configuración. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php PHP cargará todos los ficheros de /usr/local/etc/php.d/*.ini, y luego de /etc/php.d/*.ini como ficheros de configuración.
Versión | Descripción |
---|---|
7.0.0 |
Las almohadillas (# ) ya no se reconocen como comentarios.
|
5.3.0 |
Las almohadillas (# ) ya no deberían utilizarse como comentarios,
ya que lanzarán una advertencia de obsolescencia si se emplean.
|
5.2.0 | La variable de entorno PHP_INI_SCAN_DIR se puede establecer para sobrescribir el directorio de búsqueda mediante el script de configuración. |
5.1.0 | Es posible referirse a variables .ini existentes dentrode ficheros .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.
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
in php.ini you can reference to an existing directive or an environment variable using the syntax ${varname}.
Here are some examples.
sys_temp_dir = "${WINDIR}"
--- ${WINDIR} will be replaced by $_ENV['WINDIR'] at runtime
--- you can set environment variables by Apache and use them in php.ini
--- FcgidInitialEnv AUTHOR "WUXIANCHENG"
--- error_log = "${AUTHOR}.log"
error_log = "${sys_temp_dir}"
--- ${sys_temp_dir} will be replace by the value of sys_temp_dir
Also you can use PHP constants in php.ini, but DONT'T wrap them in ${} or "".
error_log = "/data/"PHP_VERSION"/"
--- it works like this php code:
$error_log = "/data/" . PHP_VERSION . "/";