Cronjobs desde PHP

NeB1

Buenas a todos,

Me ha surgido una dudilla haciendo una pequeña aplicación web. Consiste en una aplicación en la que puedes enviar sms masivos a todos los número que quieras a la vez.

El tema es que también tengo la funcionalidad de programar el envío de SMS para una fecha y una hora determinada.

Pues bien, para esto último se me ocurren dos alternativas:

1º Programar una tarea que se ejecute cada minuto en el crontabs y que ejecute un script PHP que consulte si hay que enviar algún sms.

Esta opción sería la más fácil de desarrollar, pero creo que es una carga constante en el servidor, no muy grande pero no sé, no me parece muy elegante

2º Que cuando se programa un envío, el script modifique directamente el archivo crontabs, añadiendo una fila nueva con el momento en el que se tiene que realizar dicha acción. Al ejecutarse el script de envío de sms programados, este lo primero que hará será buscar en el archivo crontabs la fila que es la responsable de la ejecución del mismo y la eliminaría

Esta opción parece como más óptima pero también parece un gran jaleo de desarrollo.

¿Vosotros que me recomendaríais? ¿Hay otras alternativas?

LOc0

Sin duda, opción 2.

La alternativa sería "re-inventar" el cron mediante dos scripts sencillos.

Script 1:
Se despierta, envía el/los SMS que toquen, consulta la tabla de envíos pendientes (ordenada por timestamp) y se duerme los segundos que falten hasta el envío más cercano.

Script 2:
Mete los nuevos envíos en la tabla despertando al script 1 después, por si acaso hay un nuevo envío pendiente más próximo.

Pero ya te digo que lo de dormirse hasta que toque es muuuuuuy parecido a lo que hace crontab internamente, así que...

Salu2 ;)

1 respuesta
Fr4nk0

NeB1 por curiosidad, cómo envías SMS a móviles desde PhP?
¿llamando a algún script de otro lenguaje o directamente desde PhP?

Hace tiempo leí, que para mandar un SMS desde PhP era lo mismo que mandar un mail, ya que las compañías formaban los envíos de la forma número_movil@compañía, pero nunca llegué a comprobarlo.

1 respuesta
NeB1

#3 también ví eso, pero no, en nuestro caso tenemos un contrato con una compañía de telefonía y trabajo con la API que me han pasado.

#2 Lo que tu dices es crear un proceso continuo en el servidor que haga un fork y lo meta a dormir tantos, días, meses u horas como sea necesario, no? mmm veo incluso menos jaleo jugar con el crontabs. El problema es que para eso tendría que deshabilitar suPHP para poder acceder a /etc >.< el usuario de la web solo tiene acceso a la carpeta donde esta la web y me gustaría que siguiera siendo así.

No se puede crear otro archivo crontab en otra ubicación? o sea, tener varios crontabs, y que el sistema haga caso de todos?

Ya sería la repera que fuera un crontab exclusivo para un usuario en concreto.

LOc0

No es necesario usar fork(). Es un simple buclecillo:

while(1)
{
        $mensaje=leer_tabla();

    if($mensaje->time <= time())
    {
         $mensaje->enviar();
         actualizar_tabla($mensaje); //Borramos
    }
    else
        sleep($mensaje->time-time());
}

Y luego el script para añadir mensajes a la tabla que sólo se ejecuta cuando toca.

Ya sería la repera que fuera un crontab exclusivo para un usuario en concreto.

Pues así es xD

Salu2 ;)

APOCa

Y digo yo, por que no programas un script en bash o php directamente? Este que se encargue de consultar en la bbdd si hay mensajes a enviar y realice la acción, no?

1 respuesta
NeB1

#6 pero entonces no se ejecutará el día, la hora, el minuto y el segundo que el usuario decida, tengo que dejar programada la ejecución del script.

Obviamente tengo un script que al ejecutarlo consulta en la BBDD y envía los sms.

1 respuesta
APOCa

#7 No había tenido en cuenta el tema de los segundos. Si fuera en rangos de 1 min de lujo. Aunque puedes hacer un script que este en memoria y consulte cada seg. Si no es mucha cantidad no debería dar problemas.

Por cierto, al final como has decidido hacerlo?

1 respuesta
eXtreM3

Leyendo este thread y todas las respuestas creo que podreis responderme a una duda que siempre tuve sobre cómo realizarlo. Cómo se ejecuta un script a una determinada hora en un servidor en mysql?

Por ejemplo que todos los días se haga un select * from tabla y se ejecute la función mail enviando resultados.

1 respuesta
APOCa

Pues lo que comentamos. Realizas un script en bash, o php, python o lo que te de la gana y lo metes en el crontab.

1 respuesta
NeB1

#9 lo que dice #10

El archivo crontab simplemente contiene las tareas programadas a ejecutar. Cada línea es un comando que quieres ejecutar precedido de unos números que indican la frecuencia. así pues puedes poner

30 21 * * 6 /sbin/shutdown -h now

Que apagará el ordenador todos los sábados a las 21:30 (m s h mes dia).

Para editar el archivo crontabs, o bien lo editas como un archivo de texto cualquiera si conoces su localización, si nos, también hay un comando explicito para hacer lo mismo que es:

crontab -e

(creo xD esto último no se si era así seguro)

#8 Estoy a la espera de que me den el acceso ssh para ver la máquina donde va a ir montado y decidir. Posiblemente primero metere una tarea que se ejecute cada minuto xD para acabar más o menos rápidamente, y luego lo haré bien.

1 respuesta
APOCa

Sí, es crontab -e para editar y -l para listarlo.

*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0 - 6) (Sunday=0)
|     |     |   +------- month (1 - 12)
|     |     +--------- day of        month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

#11 Es que de esa forma creo que es lo mejor, ya que por mucho que el usuario quiera que se envíe al segundo 12 siempre va a llegar mas tarde. Y meter el proceso en menos tiempo creo que es cargar la bbdd para nada. Todo depende de la cantidad de datos que tenga que mover, claro esta.

1 respuesta
NeB1

#12 hombre, lo mejor es que cuando un usuario crea un sms programado para X fecha, crear en el crontabs una nueva linea para ejecutar el script de envío de SMS esa X fecha (y solo esa). Una vez el script despierta, busca en el crontab que linea le ha llamado, y la elimina.

Así el script en cuestión solo se ejecuta cuando se le necesita y no cada minuto.

1 respuesta
dagavi

Si solo necesitas que se envíe una vez, porque no usas at en vez de cron?

No tendrías que usar un script que borre de la información del daemon.

2 2 respuestas
APOCa

#13 Existe el comando "at" que sirve para ejecutar una tarea a una hora concreta y esta se borra una vez realizada.

edit: tarde xd

LOc0

+1 a #14

No me acordaba de at (la verdad es que hay comandos para todo...)

Salu2 ;)

NeB1

#14 te quiero xDD no sabía que existía ese comando.

Usuarios habituales

  • NeB1
  • LOc0
  • APOCa
  • dagavi
  • eXtreM3
  • Fr4nk0