Ejecutar scripts PHP mediante CRON y cURL

CRON es un componente crucial de un servidor web. Es el encargado de ejecutar tas tareas planificadas, como notificaciones, mailings, backups y cosas por el estilo.

Crear una nueva tarea o trabajo (cron job) es muy sencillo, simplemente con el comando:

crontab -e

Este comando te llevará al editor de trabajos de cron donde se introducen los instantes en los que se deben ejecutar ciertas sentencias o scripts/ficheros ejecutables.

Para ahorrarnos tiempo:

@hourly /home/usuario/script1.sh
@daily /home/usuario/script2.sh

ejecutará los scripts especificados cada hora y cada día respectivamente. En las páginas del manual de cron podemos encontrar ejemplos más avanzados para configurar los trabajos.

De acuerdo a la documentación de documentación de PHP, ejecutar un script PHP mendiante CLI es tan simple como hacer lo siguiente:

php -f mi_script.php

Sin embargo, hay varias cosas que no están disponibles en la versión CLI (interfaz de línea de comandos) de PHP, por ejemplo cuando queremos llamar a una URL semántica (que el sistema web luego mapeará a una ruta de un script PHP) pero no conocemos explicitamente cual es la ruta y/o parámetros concretos de ese script .

Para solucionar este problema nos valdremos de cURL (también podríamos conseguirlo con wget, o usar lynx, … hay varias formas de conseguir el mismo resultado) ya que cURL puede realizar llamadas a URLs como si fuesen visitas de un usuario desde su navegador. Basándonos en esto, podemos ajustar cURL para que ejecute un script que esté disponible vía URL.
Por ejemplo tendríamos el script1.sh referenciado anteriormente por cron podría ser:

#!/bin/bash
curl http://test.com/test_asdasdasdasdasd.php

Lo que haría que cada hora cron llamase a ese script sh, el cual a su vez haría que se ejecutase el script php referenciado el esa URL.

2 comentarios en “Ejecutar scripts PHP mediante CRON y cURL

  1. Hola, buenos días. Muchas gracias, estaba tratando de programar una tarea cron que ejecutara un script de php que hace conexión a una base de datos Oracle. Cuando ejecutaba manualmente con php desde línea de comandos, con cualquier usuario, me arrojaba que no encontraba oci_connect(); este error también aparece si ejecuto desde la tarea cron. He comprobado variables de entorno, de todo lo que he encontrado buscando por google, y nada (hay que anotar que el script php ejecuta bien desde el navegador, las librerías oci están instaladas y funcionando). Acabo de hacer la prueba ejecutando con curl, como dice en tu entrada, y manualmente por línea de comando sí lo ejecuta (por fin!!), pero sigue sin hacerlo por cron; en cambio me envía un mensaje al mail del usuario, diciendo: Object MovedThis document may be found here

    Te agradezco si me puedes ayudar, no sé qué otra cosa revisar. Muchas gracias de nuevo.

    • ¿Has probado añadiendo la opción CURLOPT_FOLLOWLOCATION? Es decir, añadiendo a la inicialización de CURL:

      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

      Por ejemplo, un fragmento de código completo sería algo así:

      $curl = curl_init();
      $url = “http://laurlquequieras.com”;
      curl_setopt($curl , CURLOPT_URL, $url);
      curl_setopt($curl , CURLOPT_POST, 1);
      curl_setopt($curl , CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl , CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($curl , CURLOPT_POSTFIELDS, $postArray);
      $results = curl_exec($curl);
      echo $results;
      curl_close($ch);

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s