Executar PHP quando um determinado tempo é atingido - PHP - Portugal-a-Programar
Executar PHP quando um determinado tempo é atingido
By rikardo_92, July 9, 2011 in PHP
Eu preciso de fazer executar um ficheiro PHP quando uma condição é atingida.
Um utilizador usa um link, isso mete algo numa tabela temporária que tem lá uma coluna chamada 'ending_time' que é o tempo em que essa informação passa a definitiva. O meu problema é como faço executar o PHP nessa altura? O PHP iria eliminar a entrada da tabela temporária e inserir uma na permanente.
Pensei em cronjob mas pelo que li na net isso serve para fazer a determinadas alturas. Não posso usar aquilo para verificar a cada segundo.
Nem o PHP é feito para isso. Mas podes desenvolver uma script que receba os argumentos que pretendas e chamá-la a partir do PHP.
Isso eu sei. A minha questão é como processar aquilo sem o utilizador estar a aceder à página.
Será correr esse script sempre que qualquer utilizador abra a página uma boa solução?
Podes fazer um cronjob de segundo a segundo mas e capaz de puxar bastante pelo server já pensast em criar eventos no mysql?
Podes sempre criar um daemon em PHP - só tens que te preocupar com o arranque do mesmo, que até pode ser por meio de um cron, que confirma que o daemon está a correr, de hora a hora, ou algo do género...
Qual será a maneira que menos puxe pelo servidor?
Um utilizador acede a uma página, nesta tem uns links que fazem determinadas acções. Essas acções não é para acabarem logo no momento mas sim para irem para a base de dados que tem lá guardado a hora a que elas acabam. O que eu quero é executar um script que faça umas alterações na base de dados quando estiver na hora das acções acabarem.
O cronjob pelo que me parece está fora de questão. Esse daemon é fácil de por a correr em qualquer servidor? A ideia é que ele verifique a base de dados (segundo a segundo parece-me muito puxado) de 10 em 10 seg ou 20 em 20. Algo assim.
Os cron não puxam assim tanto, depende muito do tempo de intervalo. Têm é outras limitações, que os daemon conseguem ultrapassar (por exemplo, nunca há sobreposição de execução).
O cronjob pelo que me parece está fora de questão. Esse daemon é fácil de por a correr em qualquer servidor?
Depende. Um daemon tem de ser feito (pelo menos, feito em condições) usando a extensão Process Control que a) nem todos os provedores de alojamento permitem usar e só está disponível em máquinas Linux. Por isso, certifica-te que é uma máquina Linux e depois só tens de convencer o hoster a instalar (e deixar-te usar) essa extensão.
Isso assim é um problema.
Eu estou a fazer um jogo. As pessoas metem edificios a evoluir, a ideia por trás disto é "finalizar" os edificios a horas actualizando assim a produção no momento em que é suposto eles terminarem.
Eu calculei que fosse algo desse estilo...
Acho que já em tempos respondi a algo do género aqui no P@P - a forma mais elegante de fazer isso não é dessa forma, mas sim matematicamente.
Como matematicamente? As coisas têm que ser a horas porque afecta ele próprio e outros players. Eu para os edificios e produção já tenho tudo a funcionar. Só falha a finalizar o edificio.
Eu podia por aquilo a verificar sempre que o jogador anda pelas páginas. Então e se ele não andar? Nesse caso podia por todos os utilizadores a verificar se há algum edificio no mundo todo por finalizar. Mas isso talvez criasse um load desnecessario e levantava o problema que se não houvesse jogadores no momento as coisas não eram feitas quando se devia e perdiam-se recursos.
O meu problema reside mesmo no: edificio acaba -> consequencias dele ter acabado.
[ transaccoes ]
transaccao_id [int primary autoincrement]
desc [varchar(100)]
data [timestamp index]
variacao_imediata [int]
variacao_horaria [int]
A cada visita:
$sql = "SELEC * FROM transaccoes WHERE data <= NOW() ORDER BY data ASC";
// executa a query da maneira que quiseres (mysql_*, MySQLi, PDO, whatever)
// para efeitos demonstrativos, vamos assumir que ficas
// com todos os valores num array
$valor_actual = 0;
$ultimo_timestamp = 0;
foreach($transaccoes as $transaccao)
$valor_actual += $transaccao['variacao_imediata'] + round($transaccao['variacao_horaria'] / 60 * ($transaccao['data'] - $ultimo_timestamp));
$ultimo_timestamp = $transaccao['data'];
Para facilitar (e para os ciclos não ficarem cada vez maiores), podes guardar o valor actual noutra tabela de cada vez que o utilizador visita o site, e partir desse valor, em vez de partir sempre do zero.
EDIT: ali atrás é "/ 3600" e não "/ 60"; além disso, talvez seja melhor usares um for em vez do foreach, uma vez que tens de pegar no último para calcular a produção até à hora actual. Finalmente, não te esqueças que, se usares outra tabela com os valores actuais calculados, que o $ultimo_timestamp não pode ser zero, mas sim o dessa tabela.
Em relação ao quando executar, podes sempre usar o método se usares um acção em especial para provocar a execução disso.
Eu preferia o evento de um login ou de um acesso aleatório de um utilizador:
Independente de servidor
Não precisa de cron
Independente de sistema operativo
O quer que se fez para activar o script desses calculos irá afetar a duração da execução do script que o chama.
Andei a mexer no código e acabei por fazer umas alterações de maior. Acabou por ficar como o mjamado disse.
Sempre que houver um edificio por processar ela faz duas contas diferentes na produção e junta tudo.