Variables de entorno php. Todo lo que debe saber sobre la traducción de variables de entorno PHP
¡Atención! El artículo fue escrito en Windows 7, pero existen diferencias fundamentales al agregar PHP a variables de entorno otras versiones (Windows XP, Windows Vista, Windows 8, ...) no lo hacen.
¡Información! Todas las rutas en la configuración se especificarán en función del hecho de que Denwer está instalado en la carpeta D: / web. Cuando utilice los datos del artículo, no olvide cambiar esta ruta por la suya.
Para conveniente usando PHP en la consola de Windows, debe configurar las variables de entorno. De lo contrario, cuando trabaje con PHP a través de la consola, en lugar del comando php, deberá escribir la ruta completa al archivo php.exe.
Supongamos que tenemos Denwer instalado en la carpeta D: / web.
Haga clic con el botón derecho en el icono "Equipo" Propiedades:
Parámetros adicionales del sistema:
Pestaña Avanzado, botón Configuración del entorno ...
Grupo " Parámetros del sistema", seleccione la variable Ruta y presione el botón editar:
Agregue la línea D: \\ web \\ usr \\ local \\ php5; y haga clic en el botón "Aceptar":
Reinicie Denwer. Ahora puede abrir la consola (Win + R y escribir cmd) y verificar trabajo PHP , ingrese el comando:
Para corregir estos errores, abra el archivo D: /web/usr/local/php5/php.ini. Busque las variables extension_dir, zend_extension, session.save_path y establézcalas en los siguientes valores.
Variables de entorno
Variables de entorno en PHP
Inmediatamente antes de iniciar el script, el servidor le pasa algunas variables de entorno con información. Algunas variables contienen algunos encabezados, pero no todos (no puede obtener todos los encabezados). A continuación, proporcionaré una lista de las variables de entorno más importantes.
HTTP_ACCEPT
Esta variable enumera todos Tipos de datos MIMEque puede ser percibido por el navegador. La línea * / * significa que el navegador comprende cualquier tipo.
HTTP_ACCEPT \u003d imagen / gif, imagen / x-xbitmap, imagen / jpeg, imagen / pjpeg, aplicación / x-shockwave-flash, aplicación / vnd.ms-excel, aplicación / msword, * / *
HTTP_REFERER
Esta variable representa información sobre la página desde la que el usuario llegó a la determinada. Puede usar esta variable, por ejemplo, para rastrear el movimiento de un usuario en su sitio y luego ver las rutas más populares.
HTTP_REFERER \u003d http://www.spravkaweb.ru/php/pril/
HTTP_COOKIE
Esta variable almacena todas las cookies codificadas en URL.
HTTP_COOKIE \u003d hotlog \u003d 1; ZDEDebuggerPresent \u003d php, phtml, php3; b \u003d b; PHPSESSID \u003d
HTTP_USER_AGENT
Identifica el navegador del usuario. Para establecer el tipo de navegador, debe verificar en esta línea la presencia de palabras: si el navegador - explorador de Internet, entonces estará presente la subcadena MSIE, y si solo hay la palabra Mozilla, entonces es Netscape.
Por ejemplo:
HTTP_USER_AGENT \u003d Mozilla / 4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)
HTTP_HOST
Contiene nombre de dominio El servidor web en el que se ejecutó el script. Esta variable es lo suficientemente conveniente para usar, por ejemplo, para generar la ruta completa, que se requiere en el encabezado Ubicación, para no vincularse a un servidor específico.
HTTP_HOST \u003d www.spravkaweb.ru
HTTP_FROM
La dirección correo electrónico el usuario que realizó la solicitud.
NOMBRE DEL SERVIDOR
Nombre de dominio o dirección IP del servidor.
SERVER_NAME \u003d www.spravkaweb.ru
SERVER_SOFTWARE
El nombre y la versión del programa del servidor que responde a la solicitud del cliente.
PUERTO DE SERVICIO
Esta variable contiene el puerto del servidor al que accede el navegador del usuario. Normalmente es 80. La variable también se puede utilizar para formar el parámetro de encabezado de ubicación.
SERVER_PROTOCOL
La variable contiene el nombre y la versión del protocolo de información que se utilizó para la solicitud.
SERVER_PROTOCOL \u003d HTTP / 1.1
REMOTE_ADDR
Esta variable contiene la dirección IP (o nombre de dominio) del nodo del usuario en el que se inició el navegador.
PUERTO REMOTO
Un puerto que se asigna al navegador del usuario para recibir una respuesta del servidor.
REMOTE_USER
El nombre de identificación del usuario que realiza la solicitud.
SCRIPT_NAME
Contiene el nombre del archivo que contiene este script. Esta variable es conveniente de usar cuando se forma el encabezado de ubicación cuando se redirige a sí mismo (autodirección), así como para sustituir el valor del atributo de acción de la etiqueta.
RAIZ DEL DOCUMENTO
El directorio raíz del árbol de documentos web.
REQUEST_METHOD
El método que usa el usuario al transferir datos. Cabe señalar que un script bien redactado debe determinar por sí mismo, en función de esta variable, qué método utiliza el usuario y recibir datos de la fuente adecuada, y no asumir que la transferencia se llevará a cabo, por ejemplo, solo por el Método POST.
QUERY_STRING
Contiene parámetros que se especifican en la URL después del signo de interrogación. Recordemos que están disponibles tanto con el método GET como con el método POST (si en este último caso se definieron en el atributo action de la etiqueta
PATH_INFO
Contiene información adicional sobre la ruta.
PATH_TRANSLATED
La misma información que en la variable PATH_INFO con un prefijo que especifica la ruta al directorio raíz del árbol de documentos web.
TIPO DE CONTENIDO
Tipo de medio de datos de solicitud.
LARGANCIA DE CONTENIDO
Devuelve el número de bytes de datos enviados por el usuario. Esta variable debe analizarse si acepta y procesa un formulario POST.
GATEWAY_INTERFACE
La versión CGI que está usando el servidor.
Ejemplo de uso de variables de entorno
Variables de entorno:
echo "Вы пришли из: ".getenv("HTTP_REFERER")."
"; $ br \u003d getenv (" HTTP_USER_AGENT "); if (strpos ($ br," MSIE ")! \u003d\u003d false) echo" Tienes Internet Explorer
"; else echo" Tienes Netscape u otros.
"; echo" Tu IP: ".getenv (" REMOTE_ADDR ")."
"; echo" Aquí están los parámetros en la línea del navegador: ".getenv (" QUERY_STRING ");?\u003e
Este es un breve tutorial para implementar la configuración de un servicio php, dependiendo del entorno en el que se esté ejecutando. Estaré encantado si alguien puede sugerir una solución más elegante o corregirla en detalle.
Idea principal
Ejecute servicios, microservicios y aplicaciones dependientes dentro del mismo ecosistema, configurable mediante variables de entorno.Problema
Este artículo repite "variables de entorno" demasiadas veces.De fábrica, php-fpm ignora las variables de entorno global (función getenv), mientras que php cli puede recibirlas.
Fondo
Puede omitir esta sección si ya ha trabajado con .env
EN este momento Estoy trabajando en un proyecto escrito en ZF2. Se utilizaron archivos de configuración para diferentes entornos para configurar el proyecto. Esto genera una gran cantidad de configuraciones duplicadas en el repositorio del proyecto, algo como esto:
- session.global.php
- session.local.php.dist
- session.unittest.php.dist
- db.global.php
- db.local.php.dist
- db.unittest.php.dist
Entonces, el proyecto ahora tiene en cuenta el medio ambiente, pero ...
Mientras que el desarrollo se llevó a cabo en máquinas en funcionamiento, el proyecto leyó el archivo .env y todo funcionó. Pero cuando implementé el entorno de prueba, resultó que si configuraba las variables de entorno del sistema de forma real, php-fpm las ignora. Varias recetas de Google y StackOverflow se redujeron a una u otra automatización del uso de dos métodos bien conocidos:1. Pasar variables a través de nginx usando la prueba fastcgi_param SOMEENV;
2. Establecer variables en el formato env en la configuración del grupo de procesos de trabajo php-fpm.
Tanto la primera como la segunda opción son convenientes para algunas situaciones especiales. Pero si piensa en el paradigma de "configurar el entorno, no la aplicación", entonces tales métodos resultan mucho más difíciles que, por ejemplo, simplemente poner el archivo .env en la carpeta con el proyecto. Pero después de todo, un orquestador, un sistema de CI o simplemente administrador de sistema no tiene que conocer los detalles del proyecto, no es elegante.
Solución propuesta
Al combinar varias recetas de la web, encontré la siguiente solución de trabajo.Probado bajo Centos 7, PHP 5.6.14.
1. Abra /etc/php.ini - Reemplace variables_order \u003d "GPCS" con variables_order \u003d "EGPCS" # Después de eso, PHP agregará variables de entorno al espacio global # http://php.net/manual/ru/ini.core .php # ini.variables-order 2. Abra /etc/php-fpm.d/www.conf, no confundir con /etc/php-fpm.conf (en diferentes sistemas puede estar en diferentes lugares, esta es la configuración del grupo de procesos www para php-fpm. - Agregue (o reemplace, si corresponde): clear_env \u003d no # deshabilitar el borrado de variables globales para los corredores 3. Configure las variables de entorno requeridas en / etc / environment (sintaxis estándar A \u003d B) 4. ln -fs / etc / environment / etc / sysconfig / php-fpm # ahora la configuración de las variables de entorno del servicio php-fpm será solo un enlace a la configuración global 5.systemctl daemon-reload && service php-fpm restart
El mismo enfoque de enlace simbólico, en teoría, también se puede aplicar a otros servicios.
Ventajas de la solución propuesta:
- Las variables almacenadas en / etc / environment están disponibles diferentes aplicaciones... Puede llamar a echo $ MYSQL_HOST en el shell o getenv ("MYSQL_HOST") en php.
- Las variables de entorno que no se establezcan explícitamente en / etc / environment no irán a php-fpm. Esto permite que el orquestador controle el entorno desde fuera del sistema de espacio aislado en el que se ejecuta el servicio.
Desventajas:
- Desafortunadamente, en php-fpm no encontré un comando que funcione para recargar por analogía con nginx, así que en caso de cambiar / etc / environment, asegúrese de hacerlo systemctl daemon-reload && service php-fpm restart.
Importante: si su aplicación no funciona en un entorno aislado (servidor, máquina virtual, contenedor), la definición de variables de entorno puede afectar de manera impredecible a los servicios vecinos en el sistema debido a coincidencias de nombres en el espacio global.