Jump to content
rikardo_92

Executar PHP quando um determinado tempo é atingido

Recommended Posts

rikardo_92

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.

O que devo fazer?

Share this post


Link to post
Share on other sites
KTachyon

Nem o PHP é feito para isso. Mas podes desenvolver uma script que receba os argumentos que pretendas e chamá-la a partir do PHP.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
rikardo_92

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?

Share this post


Link to post
Share on other sites
laboss

Podes fazer um cronjob de segundo a segundo mas e capaz de puxar bastante pelo server já pensast em criar eventos no mysql?

Share this post


Link to post
Share on other sites
mjamado

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...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rikardo_92

Qual será a maneira que menos puxe pelo servidor?

Vou tentar explicar melhor:

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.

Share this post


Link to post
Share on other sites
mjamado
Qual será a maneira que menos puxe pelo servidor?

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 :happybday: 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.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rikardo_92

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.

Share this post


Link to post
Share on other sites
mjamado
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.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rikardo_92

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.

Share this post


Link to post
Share on other sites
mjamado

Assim de repente:

[ 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.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

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:

Vantagens:

Independente de servidor

Não precisa de cron

Independente de sistema operativo

Desvantagens:

O quer que se fez para activar o script desses calculos irá afetar a duração da execução do script que o chama.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rikardo_92

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.

Não era bem esta a minha ideia inicial mas acho que ficou tudo a funcionar.

Obrigado a todos :happybday:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.