Blog de , aka skotperez

Autonomía digital y tecnológica

Código e ideas para una internet distribuida


Cómo ejecutar PHP periódicamente con cron en un servidor Linux

[actualizado el ]

Primero tenemos que tener la posibilidad de ejecutar un script PHP desde la línea de comandos, o en su defecto ejecutarlo con curl; en este tutorial lo haremos ejecutando el PHP directamente en la línea de comandos sin curl. Luego tenemos que generar el archivo PHP, y un script sh que ejecute el script PHP. Por último, configuraremos cron para que ejecute el script de bash con la periodicidad que necesitemos.

Para ejecutar un script PHP en la línea de comandos necesitamos tener instalado el paquete php5-cli, como root.

apt-get install php5-cli

La sintaxis para ejecutar un script PHP es la siguiente:

php file.php

Generamos un script PHP mínimo, que escribirá una línea en un archivo de texto plano cada vez que se ejecute, y lo llamamos por ejemplo test.cron.php; el archivo se alojará en el mismo directorio que los scripts.

$time = date("G:i:s");
$entry = "Información guardada a las $time.\n";
$file = "/var/www/testdir/test.cron.txt";
$open = fopen($file,"a");

if ( $open ) {
	fwrite($open,$entry);
	fclose($open);
}

Para que al ejecutar el script con cron no nos dé el error Could not open input file: test.cron.php, es recomendable especificar la ruta completa al archivo PHP. Si el error que obtenemos está relacionado con open_basedir restriction tenemos que definir la variable open_basedir en el archivo /etc/php5/cli/php.ini y asignarle como valor la ruta del directorio donde se encuentre el script PHP, como root, importante el punto final:

open_basedir = /var/www/testdir/.

Luego reiniciamos el servidor apache, como root:

/etc/init.d/apache restart

Creamos ahora un script de bash que ejecute el script PHP; lo llamamos por ejemplo test.cron.sh:

#!/bin/sh
php /var/www/testdir/test.cron.php

Es importante la primera línea que le dice al sistema el tipo de shell que debe usar para ejecutar el script. La shell tiene que ser la misma que almacena la variable SHELL del archivo /etc/crontab, /bin/sh en mi caso.

Por último, configuramos cron, tras asegurarnos de que el demonio crond está corriendo. Básicamente necesitamos decirle a cron qué script queremos ejecutar y con qué periodicidad. Podemos hacerlo editando el archivo /etc/crontab, añadiéndole la siguiente línea, a continuación de las reglas ya existentes, como root:

*/15 * * * * usuario /var/www/testdir/./test.cron.sh

En este caso, el script /var/www/testdir/./test.cron.sh se ejecutará cada quince minutos. Es importante que el usuario tenga suficientes permisos para leer y ejecutar el script.

Actualización 2 octubre 2013. Para añadir una tarea a cron sin permisos de usuario root podemos usar la orden crontab -e en la línea de comandos.

7 comentarios

    • Por German •

    Como veo en un log el error… o porque no me funciona?

  1. Hola German, cuando cron genera un log que envía por correo interno del localhost al usuario al que pertenece el proceso cronificado, siempre que tengas instalado un servidor de correo.

    Para saber por qué no te funciona, necesito más datos. El fallo más común está en una mala definición del path del script que se quiere cronificar: compruebalo.

    También puede ser que el script no tenga permisos de ejecución. Para comprobar que los tiene usa ls -l en la carpeta donde lo tengas alojado.

    Otra razón puede ser que el script tenga algún fallo de sintaxis que impida su ejecución. Para comprobar ejecuta el script a mano con el comando ./nombre.script.sh desde la carpeta en la que lo tengas alojado.

    • Por jamzzz

    hola, como hago para cambiar los minutos por segundos?

    1. Hola jamzzz,

      el intervalo mínimo de cron para configurar la frecuencia de ejecución de una tarea es un minuto. No se puede ejecutar una tarea cada x segundos. Más info.

    • Por T.T.os •

    Gracias!

    • Por Alberto

    Una pregunta, el archivo .sh se debe localizar en la misma carpeta que el archivo php a ejecutar o donde lo pongo?, Gracias Excelente explicacion

    1. Hola Alberto,

      puedes alojar el archivo sh donde quieras, no tiene por qué estar en la misma carpeta que el php. Asegúrate de incluir en el archivo sh la ruta correcta y absoluta al archivo php; y en crontab la ruta correcta y absoluta al archivo sh.

Dejar un comentario

*
*

 

2 trackbacks