Cómo probar rápidamente sitios web con el servidor web incorporado de PHP

Publicado: 2022-08-11

Ilustración que muestra el logotipo de PHP

¿Necesita iniciar rápidamente un servidor web para probar una aplicación PHP? ¡El intérprete de PHP tiene uno incorporado! Puede usar esto para inspeccionar rápidamente su trabajo sin ejecutar Apache, NGINX o una solución de contenedorización.

El servidor integrado de PHP recibe relativamente poca atención, pero es bastante poderoso para fines de desarrollo. En esta guía, le mostraremos cómo puede usarlo como alternativa a otros microservidores como SimpleHTTPServer de Python o el paquete npm del servidor http, ninguno de los cuales puede ejecutar scripts PHP.

Uso del servidor incorporado

El servidor incorporado es un mecanismo conveniente para ayudarlo a probar sitios PHP en entornos que carecen de un servidor HTTP completo. Está disponible en PHP 5.4 y todas las versiones posteriores. Puede ejecutarlo directamente desde su directorio de trabajo sin tener que configurar primero un host virtual.

Antes de usar el servidor, tenga en cuenta que está diseñado solo para desarrollo. La documentación de PHP advierte explícitamente contra la implementación de este servidor frente a las aplicaciones de producción. No es lo suficientemente seguro para estar expuesto en redes de acceso público.

Iniciar el servidor

El servidor se inicia pasando el indicador -S al ejecutable php :

 $ php -S servidor local:8080
[Viernes, 10 de junio, 16:00:00, 2022] Se inició el servidor de desarrollo PHP 8.1.5 (http://localhost:8080)

El argumento dado al comando especifica la dirección de escucha del servidor. Hemos usado el puerto 8080 en localhost en el ejemplo anterior. Ahora puede visitar http://localhost:8080 en su navegador web para acceder al contenido de su directorio de trabajo. Cualquier script PHP se ejecutará automáticamente cuando lo solicite.

Puede servir una ruta que está fuera de su directorio de trabajo configurando el indicador -t cuando inicia el servidor:

 $ php -S localhost:8080 -t /home/$USUARIO/public_docs

La raíz del documento ahora será /public_docs dentro de su carpeta de inicio.

Mantenga abierta la ventana de su terminal mientras usa el servidor web. Presione Ctrl+C para finalizar el proceso una vez que haya terminado de probar su sitio. PHP registrará cada solicitud entrante en la ventana de su terminal, incluido el URI y el método HTTP. Cualquier error de PHP no detectado también aparecerá en los registros.

Habilitación del acceso remoto

Escuchar en localhost no permitirá conexiones entrantes desde otros dispositivos en su red. Puede permitir el acceso remoto vinculando a 0.0.0.0 en su lugar:

 $php-S 0.0.0.0:8080

Recuerde que el servidor no está reforzado para su uso en producción y no debe exponerse públicamente. Permita el acceso remoto solo cuando sea absolutamente necesario, como al probar una característica particular en un dispositivo móvil. Asegúrate de que el puerto que usas no esté abierto a Internet.

Solicitar coincidencia de reserva

PHP buscará los archivos index.php e index.html en la raíz del documento activo cuando la solicitud entrante carezca de un componente URI. Si ninguno de estos archivos existe, el servidor seguirá ascendiendo en el árbol de directorios, buscando un índice en uno de los padres de la raíz de su documento. Esto significa que, sin querer, puede terminar sirviendo contenido que se encuentra fuera del directorio que ha especificado. Se emitirá un estado 404 No encontrado cuando se alcance la parte superior del árbol sin que se encuentre un archivo de índice.

Las solicitudes que incluyen un URI (como /file ) deben coincidir exactamente con un archivo estático en la raíz del documento. De lo contrario, se devolverá un 404. PHP establece automáticamente el encabezado de respuesta de Content-Type en el tipo MIME del archivo servido para las extensiones de archivo más populares.

Uso de un script de enrutador

Opcionalmente, puede configurar el servidor web para llamar a un script en cada solicitud. Esto le permite usar el controlador frontal de su aplicación para realizar un enrutamiento dinámico avanzado.

La funcionalidad del enrutador se habilita proporcionando un nombre de archivo PHP en la línea de comando cuando inicia el servidor:

 $ php -S localhost:8080 enrutador.php

PHP ahora usará router.php para manejar cada solicitud entrante. Puede enrutar a los usuarios al punto apropiado en su aplicación al inspeccionar el URI de la solicitud:

 if ( $_SERVER [ "REQUEST_URI" ] === "/panel de control" ) {
    require_once ( "tablero.php" ) ;
}
de lo contrario si ( $_SERVER [ "REQUEST_URI" ] === "/perfil" ) {
    require_once ( "perfil.php" ) ;
}
más {
    require_once ( "404.php" ) ;
}

La salida producida por la secuencia de comandos de su enrutador se convertirá en la respuesta que se envía al cliente. Una excepción es si el script devuelve false : en este caso, PHP recurrirá a devolver el archivo estático que coincida con el URI de solicitud original.

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // Ruta al punto final de API correcto
    // ...
}
más {
    // Servir otras rutas estáticamente
    devolver falso ;
}

Detección del servidor incorporado a partir de su código PHP

Su código PHP puede detectar si el servidor web incorporado lo está llamando al inspeccionar el nombre de la interfaz activa. La función php_sapi_name() proporciona este valor. Se establecerá en cli-server cuando el componente del servidor integrado invoque el script.

 if ( php_sapi_name ( ) === "servidor CLI" ) {
    habilitar_modo_desarrollo ( ) ;
}

Manejo de múltiples solicitudes al mismo tiempo

El servidor se ejecuta de forma predeterminada en un modo síncrono de un solo proceso de forma predeterminada. Las solicitudes se manejan individualmente y se bloquean entre sí para que no se ejecuten hasta que se completen. Esta es una de las razones por las que el servidor no es adecuado para su uso en producción.

PHP 7.4 agregó soporte para manejar múltiples solicitudes al mismo tiempo. Depende de la disponibilidad de fork() y no funciona en Windows. El servidor bifurcará a un nuevo trabajador para atender cada solicitud entrante cuando este modo esté habilitado. Puede activarlo configurando la variable de entorno PHP_CLI_SERVER_WORKERS en la cantidad de trabajadores que desea:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

Esta funcionalidad todavía está marcada como experimental en PHP 8.1.

Resumen

PHP tiene un servidor web incorporado que es una forma conveniente de probar sus aplicaciones y exponer rápidamente el contenido del sistema de archivos local en su red local. Admite la ejecución de scripts PHP, el enrutamiento general y los archivos estáticos con los tipos MIME más comunes.

Aunque el servidor ahora admite un modo de bifurcación opcional, no es recomendable usarlo en producción. Está pensado como una ayuda para el desarrollo y carece de las funciones de personalización y seguridad que necesitará para sus implementaciones públicas. Donde sobresale es como una alternativa liviana e integrada a las plataformas de desarrollo convencionales como los contenedores WAMP, XAMPP y Docker.