Cómo ejecutar PHP periódicamente con cron en un servidor Linux
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.