El fichero de configuración

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):

  • La ubicación específica de módulo SAPI (directiva 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)
  • La variable de entorno PHPRC. Antes de PHP 5.2.0, esta ubicación se comprobaba después de la clave de registro mencionada más abajo.
  • A partir de PHP 5.2.0, se puede establecer la ubicación del fichero 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).
  • El directorio actual de trabajo (excepto CLI)
  • El directorio del servidor web (para módulos SAPI), o el directorio de PHP (excepto en Windows)
  • El directorio de Windows (C:\windows o C:\winnt) (para Windows), o la opción en tiempo de compilación --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".

Directorios de búsqueda

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.

Historial de cambios

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.

add a note add a note

User Contributed Notes 5 notes

up
1
ohcc at 163 dot com
7 years ago
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 . "/";
up
-30
david amick
7 years ago
example #2 says "[php] ; section markers (text within square brackets) are also ignored" - yet if you remove these 'section markers' everything breaks, - which means they're *not* ignored.
up
-36
Nacho Esviza - ignacio at esviza dot com
9 years ago
This solution works for me when I needed to force two diferent versions of PHP on a Windows Server 2012 r2 & IIS:

For one application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php53\php-cgi.exe -c C:\php53\php.ini"

For the other application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php54\php-cgi.exe -c C:\php54\php.ini"

I think that way is the cleanest, because there is no need to work with PATH variable or Registry or Windows directory.

Note: for some reason, this didn't work on FastCGI module, related to the way that IIS set the executable tab not allowing command line options.
up
-43
edgardoboj at hotmail dot com
8 years ago
If you have multiple installations of PHP, and "php --ini" keeps loading the same configuration file for every version instead of the configuration file on the installation path, it might be worthy to check the windows registry.

I found a key on "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP\IniFilePath" that override any installation, which cause "php --ini" to crash stating a version mismatch with the extensions being loaded.

Deleting the key "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP" solved the problem.

I guess the key was created with a windows installer for IIS on FastCGI, but just guessing.

For the record, some of the errors thrown are:
"The procedure entry point php_sys_stat could not be located in the dynamic link library php5.dll. "
"The procedure entry point php_checkuid could not be located in the dynamic link library php5.dll. "

Hope someone with such a mess will find this useful.
up
-53
pajoye at php dot net
9 years ago
Also a nice feature is the ability to use PHP's contants:
For example:
extension_dir=""PHP_MAJOR_VERSION"."PHP_MINOR_VERSION"/ext"
To Top