Cómo planificar la ejecución programada de un código PHP en Linux con CRON cuando PHP funciona como módulo Apache

Surge la necesidad de planificar en el sistema de gestión de incidencias opensource Mantis Bug Tracker la ejecución programada del envío de correos de manera asíncrona, tal y como aparece en este artículo.

En la configuración por defecto de dicho sistema el envío de emails se realiza de forma síncrona, en tiempo real. Al realizar cualquier modificación sobre una incidencia, cuando están habilitadas las opciones de envíos de correos, y son muchos los proyectos, usuarios e incidencias abiertas, tarda mucho en actualizar una incidencia.

En dicho artículo de la base de conocimientos de Mantis se especifica que habría que añadir a un fichero script .sh la siguiente línea:

php /path/to/mantis/scripts/send_emails.php

Normalmente el binario de php se encuentra en /usr/bin, pero puede variar según la distribución. Me disponía pues a buscar el binario de php, desde la consola:

Primero actualizar índices de búsqueda de ficheros:

>locatedb

Luego buscar un fichero binario sin extensión:

>locate php.

No lo encuentro. Busco información de directorios dentro de los ficheros de configuración php.ini:

>locate php.ini

Existen varios. No observo información relevante en ellos, ni tampoco encuentro el binario de PHP.

Se trata de una distribución llave en mano preparada de TurnkeyLinux. Existen muchas soluciones en imágenes preconfiguradas y listas para utilizar. En este caso es una solución preparada con una instalación de Mantis BT Bug Tracker.

Observo en el administrador de linux Webmin que viene preinstalado de serie que la instalación de PHP está basada en un módulo de Apache:

>locate *php*.so

Aparece entre otros el fichero:

/usr/lib/apache2/modules/libphp5.so

Tenía dos opciones:

  • Instalar PHP en un directorio aparte
  • Intentar ejecutar el código del fichero send_emails.php de otra manera, puesto que no se podía llamar a dicho

La primera opción tiene sus riesgos. Estas instalaciones de TurnkeyLinux traen una configuración específica y diferente con respecto a la instalación de Apache, PHP y demás. Si instalo algo nuevo, se corre el riesgo de modificar el funcionamiento de Webmin y PHP. Evito estos problemas, pero encuentro otros…

Opto por la segunda opción. Para ello, como PHP está instalado bajo un módulo del servidor web Apache, necesito ejecutar dicho código PHP en un navegador web. En este caso, Lynx, en navegador web en modo texto de linux. Viene preinstalado de serie en esta distribución basada en Debian.

Entro en la administración de Webmin (suele estar instalado en estas distribuciones de Turnkey en el puerto :12321 con conexión segura https), en el apartado Sistema – Tareas planificadas (Cron).

Antes de crear la tarea creo un fichero script llamado «emailmantis.sh». A continuación inserto en su interior las líneas siguientes:

#!/bin/sh

lynx –dump http://nombre_dominio_servidor_o_IP/scripts/send_emails.php

Creo una tarea programada que se ejecute con el usuario root, y en comando inserto la ruta y el nombre del fichero emailmantis.sh.

Editar Tarea de Cron TurnkeyLinux MantisBT

Ejecuto la tarea manualmente (existe la opción al crear la tarea, al final de la página de edición). Entonces observo que me aparece un error de que no se puede ejecutar dicho fichero en un navegador web. Esto es una medida de seguridad que se inserta en algunos códigos php para que no se ejecute libremente desde cualquier navegador. Valoro la trascendencia de modificar esa condición, teniendo en cuenta que es un servicio que tengo instalado en un Servidor local, en una intranet sin acceso público a internet. También se podría modificar el código, y preguntar por la IP desde donde se está ejecutando, para habilitar algo de seguridad. En este caso no se necesita.

Modifico el fichero send_emails.php que se encuentra en la siguiente ruta en este caso:

/usr/share/mantis/www/scripts/send_emails.php

Y comento las siguientes líneas:

# Make sure this script doesn’t run via the webserver
// echo «»;
// echo php_sapi_name();

// if( php_sapi_name() != ‘cli’ ) {
// echo «send_emails.php is not allowed to run through the webserver.\n»;
// exit( 1 );
// }

Ejecuto de nuevo, y compruebo que funciona correctamente.

Anteriormente a la puesta en marcha del script, tenemos que asegurarnos de revisar la configuración de los siguientes parámetros al valor ON dentro del fichero: /usr/share/mantis/www/config_inc.php

$g_enable_email_notification = ON; #SIRVE TAMBIEN PARA DESACTIVAR TODOS LOS CORREOS, y para que el usuario no pueda crear una nueva cuenta

#Configura envío de emails asíncrono con CRONJOB: https://www.mantisbt.org/wiki/doku.php/mantisbt:setting_up_mail_queuing

$g_email_send_using_cronjob = ON;

Con esto ya está configurada la programación de la ejecución de manera asíncrona, para evitar ralentizar el aplicativo en cada actuación sobre una incidencia, y solventado el problema de no poder encontrar el binario de PHP.

Realmente esta solución es bastante obvia para un administrador de Linux experimentado, pero a mí me costó algo obtenerla, y creo que puede ser de utilidad para algunas personas. Estas anotaciones están basadas como siempre en la experiencia diaria, en la que muchas veces necesito ayuda de otras personas o de internet.

 

msalguero has written 5 articles

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>