← PHP

Sistema de avisos em tempo real

Lida 7661 vezes

Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Boas noites!

Preciso de desenvolver um sistama de avisos em php+mysql.
Passo a explicar:

- O utilizador define um data e hora para receber o aviso (via e-mail, sms, etc);
- Chegando essa data e hora o aviso é gerado e enviado para o utilizador.

Simples!? :-P

Pelo que imaginei, teria de ter um script a rodar permanentemente, comparando dos tempos de forma a sairem os avisos no momento certo.

Exemplo: O utilizardor pode ter definido o aviso para meia hora depois.

Bom, eu andei a ver cron jobs mas ao que percebi isso permite-me definir determinadas horas e datas para executar o script, que suponho teria de ser algo que comparasse a dara actual com as datas dos avisos, mas isso vai falhar se houver um espaçamento "grande" entre as execuções, pois pode ter sido definido entre cada execução e não ser comparado antes da seguinte.

Ufa! :superlol:

Não sei se me fiz entender...

Alguém sabe como posso fazer isto?

obrigado!
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Não vejo outra forma se não cron jobs mesmo...

E se queres que seja enviado exactamente na hora definida, tens de colocar um a correr a cada minuto e comparas ao minuto. Pode ser um bocado puxado, mas vai depender dos utilizadores e das comparações que tiver que fazer.

Podes é tentar limitar, de 15 em 15mins, sei lá. É só um exemplo, depende das tuas necessidades.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Obrigado pela resposta.

Pois o que acho que pode correr mal é o facto de ter o script a correr várias vezes e isso pode puxar muito pelo servidor, penso eu de que!

Tomando como exemplo o calendário do google que tem vários eventos a várias datas e horas, será que funciona com cron job ou será alguma outra lógica??

Queria ver se encontrava outra solução só pelo facto de poder vir a puxar muito pelo servidor...
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Obrigado pela resposta.

Pois o que acho que pode correr mal é o facto de ter o script a correr várias vezes e isso pode puxar muito pelo servidor, penso eu de que!

Tomando como exemplo o calendário do google que tem vários eventos a várias datas e horas, será que funciona com cron job ou será alguma outra lógica??

Queria ver se encontrava outra solução só pelo facto de poder vir a puxar muito pelo servidor...


o meu servidor já tinha ido á vida.

Desde scrits que correm a todos os minutos, desde scripts que tem de correr todos os segundos e já deamons...

implementa e acompanha o load do servidor... se ficar ok...
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Pois daí não estar muito para aí virado, ou tenho de mudar a lógica de funcionamento ou tenho de encontrar outra solução.
A questão é que não sei como vai evoluir o projecto, logo não consigo saber se vai ter muitas comparações/tempo para fazer ou não.

Aqueles sites de avisos de aniversários, alguém sabe como funcionam?
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

UP
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Mas a Google não usa php, se queres fazer em php só assim, depois tens outras possibilidades, a malhor seria em C, mas não é fácil, nenhuma das outras possibilidades é fácil, no máximo java seria mais fácil.
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

seja qual for a linguagem... a solução é só: correr cron ou criar deamon... não adiante fugir... vai sempre lá dar
Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Não estou muito dentro do que a maioria está a sugerir, como C, cron jobs, etc.

Porque não fazes o seguinte, recorres a PHP, gravas numa tabela a data do registo em POSIX time, convertes a data do aniversário também para POSIX, fazes a diferença entre os dois e escreves novamente o tempo noutra coluna, tens 3 tempos, o de entrada, o da data de aniversário e o intervalo entre as duas, esse intervalo corresponde ao tempo de espera, fazes uma query de 5 em 5 horas para não sobrecarregar o sistema, para verificar se há aniversários hoje. Claro que isto resulta se os aniversários não forem em demasia.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Bom andei a ler algumas coisas sobre cron jobs e daemons mas ainda não fiquei muito esclarecido sobre a forma de aplicar isto, ainda estou a aprender...
Se alguém tiver algo que me ajude a entender estes dois métodos e a forma de os aplicar agradeço.
 :obrigado:


Não estou muito dentro do que a maioria está a sugerir, como C, cron jobs, etc.

Porque não fazes o seguinte, recorres a PHP, gravas numa tabela a data do registo em POSIX time, convertes a data do aniversário também para POSIX, fazes a diferença entre os dois e escreves novamente o tempo noutra coluna, tens 3 tempos, o de entrada, o da data de aniversário e o intervalo entre as duas, esse intervalo corresponde ao tempo de espera, fazes uma query de 5 em 5 horas para não sobrecarregar o sistema, para verificar se há aniversários hoje. Claro que isto resulta se os aniversários não forem em demasia.


@Souza Percebi na teoria o que descreveste, mas não consegui ainda perceber o porquê de ter que converter a data, se usar a data na sua forma original não funcionaria?
Como é que definiria a query para ser executada de X em X tempo?



Talvez opte por fazer apenas 2 ou 3 verificações por dia e envie os e-mails em horários específicos, isto para não sobrecarregar o servidor, mas continuo sem saber como o fazer  :-?

Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Eu ainda não percebi bem exactamente o que tu queres fazer e tudo depende da natureza desses avisos. Há mesmo necessidade de enviar ao minuto? Se calhar não. Um ou dois avisos por dia a horas especificas chega? Então é por aí... Se for para aniversários, por exemplo, eu faria um único aviso a determinada hora, talvez assim que batesse as 12 badaladas da meia noite.

Se vais optar por 2 ou 3 notificações, então a resposta é cron jobs. Como o fazer, é simples. Ou a tua questão prende-se com o script PHP? Isso, mais uma vez, depende da natureza do que tu queres fazer.
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Bom, peço desculpa pela demorada resposta. :-x

Pelo que me sugeriram, vou optar por fazer então duas notificações por dia, isto porque os agendamentos podem ser feitos no próprio dia e poderem ficar fora das notificações.

Ainda não meti mãos à obra mas o que me parece que tenho de fazer é pegar na data actual e na data que foi definida para cada notificação e compará-las, caso sejam iguais guardo noutra tabela para ser enviado o e-mail de notificação, caso sejam diferentes ficam na mesma, depois da verificação o script começa a enviar os e-mails, espaçados para não haver bronca...

Suponho que seja o mais aconselhado!?
 :obrigado:
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

porque não fazes de uma vez e depois resolves se tiveres problemas... parece que andas a inventar a roda... e ela está á tua frente
Offline

Roberto Francisco 
Membro
Mensagens 669 Gostos 1
Feedback +3

Troféus totais: 28
Trófeus: (Ver todos)
Apple User Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Boas...

Já lá vai algum tempo mas não queria deixar o tópico sem resposta.

Decidi inicialmente fazer apenas uma verificação por dia que deve ser mais que suficiente e limitar a data de aviso de forma a que não possa ser definida para o próprio dia.

Criei então um ficheiro onde é feita a consulta de todas as entradas na BD que tenham data de aviso igual à data do dia corrente.
Para todos os listados, são enviados emails com a info necessária e registado na BD quantos emails enviou.

Depois disto configurei o Cron Job no Cpanel de forma a que executa-se esta página à hora predefinida e todos os dias.

No meu caso a página está aberta, ou seja sem barramento à abertura da página que envia os emails por qualquer pessoa, no entanto vou criar uma limitação de acesso por hora, ou seja, só pode ser acedida durante meia dúzia de minutos (hora que é executado o cron job), foi a forma mais directa que encontrei.

Por enquanto está em testes mas tem funciona correctamente.

Cumpts,
Roberto Francisco