Ir al contenido principal

PHP con Apache sobre Windows

Continuando con esta serie de instalación de herramientas para desarrollo web sobre Windows, continuamos con la instalación y puesta en marcha de PHP sobre un servidor Apache.

¡¿Queeeeeeeeeeeeeeeeee??!

Seguro esa será la reacción de muchos. En un mundo donde los frameworks basados en Javascript proliferan (NodeJS, React, NextJS por citar algunos ejemplos), ¿porqué invertir tiempo en PHP, ese “dinosaurio” de los lenguajes de programación para Web? Bueno, hay varias razones:

  • Es un lenguaje fácil de aprender, instalar y poner en marcha.
  • Tiene una amplia documentación en su página y en diferentes idiomas, como el español (https://www.php.net/manual/es/).
  • Wordpress es una de las herramientas para manejo de contenido de mayor uso en la Web y está desarrollada sobre PHP.
  • Cierra el top 10 de las tecnologías más populares en la encuesta de servicios de StackOverflow 2022 (https://survey.stackoverflow.co/2022/).
  • Sigue siendo de lejos una herramienta estable que se mantiene en continua evolución y mejora (aunque muchas de esas mejoras implican echar para atrás algunas de las características que lo hicieran atractivo alguna vez, pero hay que aceptarlo, son para “mejorar”).

Y bueno, para qué negarlo, PHP es la herramienta con la que he trabajado desde hace mucho y una a la que le tengo bastante aprecio y agradecimiento así me haya sido impuesta al comienzo, por allá cuando apenas estrenaba su versión 3 (hoy día, a la fecha en que se escribe esta entrada, estamos en la versión 8.2.1). Así que, resumiendo: ¿porqué no? 

Descargando PHP

El primer paso por supuesto, consiste en conseguir los archivos binarios de PHP para Windows. No recomiendo el uso de instaladores .msi o .exes porque que con los binarios es más rápido la actualización de versiones, basta solamente con remplazar los archivos binarios con cada nueva versión, eso si, previa lectura de qué ha cambiado para no correr riesgos.

Siendo así, buscamos en la página de descargas de PHP (https://www.php.net/downloads) la versión más reciente y seguimos el enlace asociado a “Windows downloads”.

Aviso: Es probable que por las condiciones del servidor donde se desplegará el proyecto a desarrollar debas descargar una versión previa de PHP. En ese caso, debes revisar con cuidado la documentación de configuración asociada a dicha versión.

En la página de descargas para Windows, escoge el archivo a bajar, según sea para un equipo de 32 o 64 bits. También debes decidir si será una versión “Thread safe” o “Non thread safe”. ¿Qué diferencia una de otra? Básicamente, el cómo será invocado PHP en el servidor web, para determinar si requiere algún soporte especial al trabajar en modalidad multihilos. En nuestro caso, lo haremos a través de un módulo desarrollado especialmente para Apache, de modo que se requiere el modelo “Thread safe”.

Importante: Para facilitar el proceso, recuerda usar en Windows la distribución Apache llamada “Apache Lounge”, recomendada directamente en la página PHP, como puede verse en la página de descargas, en la columna izquierda bajo el título “Which version do I choose?”.

Ya descargado el archivo, solo queda copiar los archivos desempaquetados a un directorio de trabajo. Los que han leído la entrada de instalando Apache sobre Windows sabrán que recomiendo usar un directorio base para copiar en él todas las herramientas a usar para tus proyectos de desarrollo web y mantenerlo separado del directorio donde copiaras/crearás tu trabajo, tanto para el código como para los datos de tus “bases de datos”. De esta forma, las actualizaciones serán mucho más fáciles de realizar al no tener que modificar tus archivos de trabajo.

Una vez escogido dicho directorio, copia el contenido del ZIP en un subdirectorio “php”. Como preferencia personal evito incluir la versión en el nombre para facilitar referencias externas y no estar modificándolas con cada actualización de versión.

Para validar que todo funciona correctamente y que ya tenemos PHP sobre Windows, abre una ventana de comandos, ubica el directorio donde se realizó la copia y ejecuta el siguiente comando:

php.exe -v

La respuesta deberá ser similar a la siguiente:

PHP 8.2.1 (cli) (built: Jan  3 2023 23:31:58) (ZTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.2.1, Copyright (c) Zend Technologies

Ejecutando PHP desde el servidor web

Ahora vamos a lo verdaderamente importante, necesitamos habilitar PHP para ejecutarse en el servidor web y poder así construir aplicaciones/páginas web y poderlas ver correr localmente en nuestro computador. Para esto, debemos realizar algunas modificaciones al archivo “conf/httpd.conf” de Apache.

Adiciona una referencia “index.php” a la lista de archivos automáticamente consultados por Apache cuando se invoca un directorio. Por defecto Apache siempre buscará el archivo “index.html” para visualizarlo en el navegador pero si adicionamos “index.php” como primera instancia, este será el archivo que buscará primero y luego, si no lo encuentra, buscará el respectivo “index.html”.

<IfModule dir_module>
    DirectoryIndex index.php
    DirectoryIndex index.html
</IfModule>

Para que esta configuración tenga sentido cuando realicemos nuestra prueba en el navegador, incluimos un archivo “index.php” en el directorio indicado en el parámetro “DocumentRoot” de la configuración de Apache, con la siguiente línea:

<?= phpinfo() ?>

Esto es básicamente un script que ejecuta la función phpinfo() y la muestra en pantalla, como veremos más adelante.

Se adicionan también las siguientes línea:

LoadModule php_module "C:/xxxx/php/php8apache2_4.dll"
Cargar el módulo PHP adaptado para Apache (verifica que el archivo indicado exista en el directorio donde instalaste PHP).
PHPIniDir "C:/xxxx/php"
Indica el directorio donde Apache debe buscar el archivo de configuración de PHP (php.ini).
Finalmente, se indica al servidor que solamente los archivos terminados en .php (y no otros similares, como por ejemplo .php.txt) se ejecutarán usando el módulo de PHP, lo que se obtiene adicionando las siguientes líneas:
<FilesMatch \.php$>
      SetHandler application/x-httpd-php
</FilesMatch>

Reinicia el servidor y verifica que no se presenten mensajes de error.

A continuación, consulta la dirección URL “http://localhost” o “https://localhost” (si tienes habilitado el protocolo HTTPS, como se indica en la anterior entrada HTTPS con Apache sobre Windows) y deberías tener como respuesta una página similar la siguiente:

Si no obtuviste esta página como respuesta, revisa nuevamente los pasos descritos, quizás pasaste algo por alto. Si por el contrario, obtuviste esta respuesta, estás viendo una página creada por PHP donde puedes ver la configuración PHP actual: módulos habilitados y variables globales encontradas en el sistema.

Tip de seguridad: Nunca dejes este tipo de scripts habilitados en un servidor en producción, la información mostrada debe ser confidencial y estar lejos de la vista de personas con dudosas intenciones.

¿Terminamos?

En lo que respecta a la configuración de Apache, si. Tenemos la certeza de que ya podemos ejecutar scripts PHP en nuestro servidor web local, con lo que hemos alcanzado el objetivo de esta entrada. Sin embargo, PHP requiere ser configurado apropiadamente para operar como proveedor de servicios en la web, lo que seguramente haremos en una próxima entrada.

Comentarios

Entradas populares de este blog

Sesión de usuarios en aplicaciones web

Uno de los módulos más importantes y a la vez menospreciados cuando se aborda la tarea de crear un sitio web de servicios, ya sea para una intranet corporativa o un sistema de gestión de información ( SGI ) es la gestión y administración  requerida para una correcta implementación de sesiones de usuario. Y es que llevamos tanto tiempo usando usuarios y contraseñas en Internet, en cualquiera de sus muchas variaciones, que se asume muchas veces que esto ya forma parte del ADN de toda solución web y como tal, se destina muy poco tiempo y estudio a este apartado cuando se planifican las actividades de desarrollo. Lo cierto es que cada aplicación acostumbra desarrollar su propio esquema de manejo de sesiones y asumir que es algo superfluo puede equivaler a “pegarse un tiro en el pie”, especialmente cuando un módulo de este tipo se diseña desde ceros. Al referirse al manejo de sesiones de usuario suele pensarse únicamente en el proceso de capturar el nombre de usuario ( username ) y su cont

Manejo de clases globales únicas en PHP

Imagen de Tumisu en Pixabay ¿Cómo acceder desde cualquier script en tu proyecto a Clases y/o funciones de uso común? Este puede ser una de las primeras directrices a establecer para cualquier proyecto porque siempre, siempre , sea en  PHP  u otro lenguaje, será necesario usar recursos comunes. En PHP existen diferentes alternativas para su manejo, ya sea por medio de variables globales o de clases/objetos estáticos. A continuación consideraremos una propuesta para este manejo. Creación de recursos globales Para ilustrar esta solución, partimos de la necesidad de implementar una librería para manejo de servicios relacionados con el servidor Web, que de forma amigable nos permita disponer de información como: Valores almacenados de la variable superglobal $_SERVER de PHP. Valores asociados a la consulta realizada por el usuario, por Ej. la dirección IP del usuario o la URL ingresada. Valores asociados al servidor web usado, por Ej. la dirección IP del servidor o la ubicación de

¿Qué tan bueno es realmente el “foreach” en PHP?

Imagen de garionhk en Pixabay Como toda buena historia, esta comienza hace algún tiempo. El que fuera mi jefe por allá en la primera década del 2000, realmente odiaba (y mucho) el uso del foreach en el código PHP . Prefería que usáramos alguna alternativa diferente, alguna combinación del  for o del while . ¿Por qué? Ve tú a saber, nunca fue abierto respecto a las razones de su aprensión hacia ese constructor propio del lenguaje. Pero antes de continuar, veamos qué es y para qué nos puede servir. Arreglos, tenían que ser arreglos ¿Qué es foreach ? De acuerdo al manual de PHP , su definición es la siguiente: El constructor foreach proporciona un modo sencillo de iterar sobre arrays . foreach funciona sólo sobre arrays y objetos , y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Para su uso correcto existen dos sintaxis validas, a saber: foreach (expresión_array as $value) { ... } foreach (expresión_array as