Ejecutar diariamente un fichero PHP mediante crontab + wget

El problema de hoy es ejecutar un script php cada día a una hora determinada. Necesitamos ejecutar una consulta sql que elimine los pedidos no validados  diariamente. Explicaremos como realizar esto desde un hosting externo.

En en el caso concreo en el que estamos, queremos ejecutar cada día un fichero php alojado en nuestro servidor. Concretamente nuestro hosting posee el gestor Cpanel, desde el cual se nos ofrece una herramienta web para programar tareas. Dentro de las herramientas avanzadas disponemos del “Programador de tareas” desde el que tenemos dos modos el avanzado y el estandard.

Lo mas importante es conocer el comando que vamos a untilizar para lanzar la petición al fichero php deseado. Para usaremos wget ‘http://url-del-fichero.php’ > /dev/null ;

De este modo se lanza una peticion a la url que deseemos, es importante poner entre comillas simples la url. La parte final indica que la salida del comando wget no la necesitamos y la redireccionamos unfichero vacio. si nos interesara guardar la salida, se podria redireccionar a un fichero.

Ademas podemos hacer que cpanel envie un mail con la salida del fichero por email poniendo una dirección de email en la caja destianda a ello en la pantalla. De todos modos, en nuesto caso es aconsejable que este tipo de ficheros no tengan ninguna salida. Puesto que solo queremos actualizar la base de datos.

Modo Avanzado:

todo aquel que sea mas experto en unix, se sentirá mas comodo desde esta pantalla donde puede usar una sintaxis mas parecida a la del comando Cron de unix. Los  ‘*’  indican que se repita siempre. En el ejemplo de la figura se repetiria todos los dias, de todos los meses de todos los años a las 00:00 h. Lo que quiere decir que cada día a las 00:00 se ejecutará el comando que deseemos.

crontab avanzado de Cpanel

crontab avanzado de Cpanel

Modo Estandard:

Para los usuarios menos avanzados se puede elegir en modo estandard, donde podremos seleccionar de la lista las opciones de repeticion del intervalo. En el ejemplo se selecciona el minuto 0, la hora 3 y todos los demas se dejan pordefecto. Es curioso pero hay que dejar en día de la semana cada fin de semana, aunque la traducción no es la mas correcta, simplemente indica que tambien se repite los fines de semana, ademas de los dias de entre semana.

crontad estándard en Cpane

crontad estándard en Cpanel

Si tuvieramos acceso al servidor y este tuviera sistema operativo linux, podríamos usar los comandos propios de la consola de linux, para programar tareas como son:

  • comando cron -> sirve para ejecutar comandos de unix en intervalos regulares de tiempo períodicos. Así se podrán ejecutar comandos con la frecuencia que queramos, desde cada minuto, hasta solo unos dias concretos del año, solo los domingos, etc..
  • comando at: sirve para programar la ejecución de comandos unix en una fecha concreta, futura y puntual. Una vez estemos haciendo pruebas es importate conocer como listar las tareas que estan planificadas, mediante el comando atq, donde saldrá una lista numerada con las tareas programadas. Para eliminar cualquiera de ellas solo hay que usar el comando atrm junto el número de tarea que aparecía en el listado del comando atq.

Etiquetas: , , , , ,

20 comentarios para “Ejecutar diariamente un fichero PHP mediante crontab + wget”

  1. Manuel dice:

    Gracias por tu información. Ha sido el único sitio donde el comando para ejecutar el Cron con wget era el correcto, después de mirar en bastantes webs.

  2. Cristian dice:

    Me alegra que haya servido el post sobre el comando wget y cron.

    podrías decir que sistema operativo usas? y que versión? Posiblemente tengamos una versión similar.

  3. Hugo dice:

    A ver si me puedes ayudar con esto.
    Necesito desde un cron job en IIS6.0 panel Plesk, ejecutar un archivo con estos parametros:
    index.php?t_=parser
    y el servidor no permite el parámetro ?t ni ninguno.
    Yo pense en crear un script php que “redireccione” o el a su vez llame a la tarea con el parametro correspondiente.
    ¿Como sería el archivo php para realizar esto?

    Si me puedes ayudar desde ya muchas gracias.

    Hugo

  4. cristian dice:

    Si por algun motivo no te deja abrir esa direción, puedes hacer como dices.

    En el php destino donde no le pasas variables para poderlo programar. Le añades:

    < ?
    header('location:http://midominio.com/miCarpeta/miFichero.php?varibles1=loquesa&otraVariable=loquesea');
    ?>

    con esto será suficiente.
    El cron hace la peticion a tu php destino, quien internamente redirecciona la url con un location de php

  5. JaSF dice:

    hola, yo tenia una pregunta, yo necesito ejecutar un script php cada minuto, pero a partir de una instruccion, y terminarlo cuando se cumpla cierta condicion. Es decir: cuando yo le doy commit a un form quiero ejecutar un script varias veces hasta que una condicion de la base de datos me diga que pare. Como realizo eso? Gracias

  6. joan dice:

    Existe una funcion llamada sleep(tiempo en segundos) en php, dentro del bucle que debes hacer en el php, una condicion podria irse al sleep porque debe esperar 1 minuto mas y hacer otra vuelta de bucle, y otra condicion se va del bucle y ha terminado la ejecucion del sleep y bucle.

  7. Chema dice:

    Hola Cristian, me surge una duda:
    yo utilizo esta funcion para enviar un mailing mensual a los socios de mi página. Si utilizo por ejemplo la direccion http://mipagina.com/mailing.php corro el riesgo de que cualquiera pueda ejecutar este script simplemente poniendo la url en su navegador no?
    un saludo.

  8. cristian dice:

    Hola, es correcto.

    Esa url, cualquiera puede ejecutarla. Por ello siempre se debe de proteger de algun modo según el uso del script. Por ejemplo, podrias usar una verificación por fecha, para que solo los dias 30,31 o 29 o 28 pueda ser enviado. Puesto que en tu caso solo es al final del mes.

    Además para que solo se envie una vez, podrías apuntarte en bd, o en un fichero en el servidor, si se ha enviado ese día ya. Y con estas 2 cosas, ya solo se enviaría una vez el último dia del mes…

    El propio escript con unas faciles comprobaciones, puedes evitar que no se ejecute cuando no toca. La idea es garantizar que solo se ejecuta cuando lo hemos programado y solo una vez.

    tambien decirte que de entrada, esa url nadie la conoce… Es un primer nivel de seguridad, debil… pero algo es algo :P

    Saludos

  9. Arka dice:

    Hola, fa la verdad fue excelente tu aporte.
    Tengo una pregunta, mi servidor o mas bien mi proveedor no me deja usar el comando wget en el Cron…

    Necesito ejecutar algo que me respade la base de datos automaticamente y no le encuentro la vuelta Cron

    Desde ya muchas gracias por tu ayuda, ya que en todo el mundo no hay nada tan concreto y bien explicado como tu aporte…

    Salu2

  10. cristian dice:

    Muchas gracias Arka,

    nos gusta hacer bien nuestro trabajo y cada vez que no encuentro algo que me hace perder mi tiempo, intento compartirlo.

    Ahora mismo no se me ocurre mas que decirte dos cosas:

    1- Habla con tu hosting o proveedor e comentale, que si no te dejan usar el wget, que otro comando puedes usar.

    2- posiblemente puedes lanzar linx, suele estar instalado en casi siempre en linux por defecto. Así puedes quizar, lanzar desde le cron un comando como linx mipagina.php..

    Espeor que te sirva.

    un saludo.

  11. cristian dice:

    Otra manera provisional sería incluir ese script en un include en los ficheros de la web. de tal modo que cada vez que alguien te visite, si necesario (puedes apuntarte en bd la ultima actulizacion) te actualize. Esto no permite controlar el tiempo entre dos copias, pero con una media de 200 visitas dia, casi te garantiza que cada dia se te ejecute ese código. No es muy bonito, pero temporalmente mientras encuentras otra manera de hacerlo, te puede salvar…

    saludos,

  12. Fer dice:

    Parece que tu artículo es un nido para los que nos liamos con los cron, muchas gracias.

    A ver si me puedes ayudar a mi también. Tengo unos cuantos feeds en una web, y claro, cada vez que se actualiza tarda mucho en abrir, por lo que quiero crear un cron que ejecute esa url cada hora para que cargue los feeds en cache y tarde menos en cargarse la url cuando entra el primer visitante despues de la actualización.

    He leido mucho sobre los cron, pero no encuentro respuesta. ¿sería posible ejecutar esa url con el comando, por ejemplo: wget ‘http://www.miweb.com/mis-feeds/’ > /dev/null ;? , o tengo que crear un script que la ejecute y meterlo en un fichero .php

    A lo mejor ni uno, ni otro, y estoy mal encaminado ;-).

    Un saludo

  13. adolfo dice:

    Perfecto, me ha funcionado a la primera con las explicaciones al principio-
    Muchas Gracias.

  14. Cristian dice:

    Hola fer,

    Pues no termino de ver el problema con lso feeds? Pq dices que quieres ponerlos en cache. Pero la cache depende del navegador del cliente, por lo que aunque tu cogieras y llamases al fichero cada hora, el primer visitante volvera a pedir los feeds pues no tiene cache de estos.

    Por lo que entiendo, lo que aría yó es hacer un script encargado de recoger los feeds y meterlos en una bases de datos ordenaditos. y cada hora o cada x minutos actualizas con un cron el fichero que refresca la BD. La parte php que ve el cliente simplemente lee de BD sin que tarde ni un segundo en pedir los feeds, siemplemente muestra los resultados de la bd. Asi ahorras problemas… no se es una solucion tan criticable como cualquier otra…

  15. Cesar dice:

    Hola buenos dias, tengo una duda, ejecuto tareas automaticas cada minutos para enviar un codigo a mis clientes, el problema es que uso el comando header (location XXXX) para enviar un servicio a una compania, pero ya no puedo seguri ejecutando mi programa, se sale y nada mas puedo mandarle una sola vez, si tengo dos clientes que les tengo que enviar en ese minuto un mensaje, nada mas se lo peudo enviar al primero porque se sale, sabes como le peudo ahcer para que regrese y siga funcionando mi while (en ese caso lo uso para sacar datos de la base de datos). Gracias

  16. cristian dice:

    puedes explicar mejor el problema Cesar?

    no entiendo lo del programa ese que tienes que se cierra…

    Usar un header location dentro del código no es problema.

    Si se te cierra ese programa donde haces una petición, quizas te sirva mas y teniendo en cuenta que solo se trata de 1minuto. y solo 2 clientes… Se podría usar la función SLEEP(60), que duerme la ejecución de un script php durante x segundos… así en tu while se ejecutaría una vez y al final de la vuelta lo duermes 1minuto y luego haces el siguiente cliente…

    Explicate mejor y quizas pueda ayudarte!

  17. minipunk dice:

    Yo utilizo strato como hosting, el CPanel es muy diferente, pero los conceptos son los mismos, he encontrado y configurado con Cron (trabajos cron le denominan en el panel de strato).
    Desde ese panel no he metido más código que la url del script, lo demás se configura desde el panel que tienen ellos.
    Mil gracias por orientarnos ;)

  18. Walter dice:

    Una Solusión para ejecutar php con wget enviando parametros es:
    wget -q –delete-after http://localhost/file.php?var1\&var2\&var3….
    a mi me funciona excelente

  19. José Carlos dice:

    El parámetro –delete-after es importantísimo si no queremos que se nos llene el servidor con archivos resultado de las pasadas del cron. Llamando wget simplemente con get ‘http://url-del-fichero.php’ > /dev/null creará un archivo nuevo a cada llamada, la redirección de la salida a /dev/null es lo mismo que si pusiésemos el parámetro -q para no mostrar la salida, pero el archivo descargado se seguirá grabando.

    La forma más limpia de usar wget en cron es la que ha indicado Walter, con -q y con –delete-after

  20. Fran dice:

    Al final de este enlace, teneis un ejemplo para quien se atreva a ejecutar un fichero php cada cierto tiempo pero haciendolo todo desde la shell del sistema,

    http://blog.frangalian.com/?p=114

Deja un comentario

CAPTCHA Image Audio Version
Reload Image