Pergunta

Eu estou tentando vir acima com uma lista de diferentes abordagens para executar tarefas agendadas em PHP. Minha intenção é fornecer uma maneira universal para tarefas agendadas funcionam em PHP. Até agora eu tenho:

1) Analisar o tráfego do site. Se você receber 770 acessos por dia (que é um hit por 2 minutos), e você agendou uma tarefa para ser executada às 6:00 AM e um visitante solicitou uma página no 5:59 AM, em seguida, executar a tarefa porque o próximo vontade visitante chegar em 6h01, em média. Run = exec ( '/ usr / bin / php -f /home/account/cron.php') neste caso.

(+) funciona em todas as plataformas, desde que os caminhos estão corretos.

(-). Requer algum poder de CPU

(-) Requer exec ()

.

(-). Não é preciso em locais menores ou em locais com grandes picos de tráfego

2) Versão melhorada das opções acima. Quando o usuário solicita a página e a tarefa destina-se a correr, não use exec (), mas incluem () depois de ter liberado o conteúdo para o usuário.

(+) funciona em todas as plataformas.

(+) Sem exec () 's.

(-). Requer algum poder de CPU

(-). Não é preciso em locais menores ou em locais com grandes picos de tráfego

3) Running um fundo processo separado para que ele está sendo executado em um loop constante. Fornecer uma interface de administração que permite que você "start" e "end" o "serviço". Ele irá então usar fsockopen () para chamar um script php que é executado infinitamente. Ele usa sleep () não consomem recursos e acordar quando for a hora certa (ver: time_sleep_until ()). Poderia procurar arquivos e lê-los para entender quando executar quais tarefas. Pode-se criar o arquivo "run-diário-03:00" que faz com que o programador para executar o código dentro do mesmo.

(+) funciona em todas as plataformas.

(+) Sem exec () 's.

(+) pode ser bastante precisa (por exemplo, se ele dorme por uma base minuto).

(-) não é estável -. Uma falha do servidor pára o planejador inteiramente

(-)? Alguns anfitriões não gostam de ter um processo em execução 24/7/365 = recurso porco

4) Executar exec ( 'crontab') diretamente no Linux e afins.

(+) Não é um devorador de recursos.

(+) é preciso.

(-). Exec ()

(-). Não funciona em todas as plataformas

5) Pedir credenciais cPanel e fazer um POST a ele para criar / gerir / crons remover.

(+) É preciso

(+) Não é um devorador de recursos.

(-) Bad para a segurança

(-) Requer detalhes do usuário = diminuiu usabilidade

(-). Não funciona em todas as plataformas (requer cPanel que não funciona no Windows)

(-). Requer cPanel

Quaisquer outras ideias?

Foi útil?

Solução

Quase todos os métodos que você sugeriu são feios, embora a maioria vai funcionar.

Meu alternativa feio é a criação de cron em uma máquina local com ligação à Internet que executa um comando curl sempre alguns minutos.

É tão feio como todas as suas soluções, mas é ligeiramente mais confiável.

Outras dicas

Eu uso uma ferramenta do Windows chamado VisualCron o ping http-protegidas por senha de scripts em servidores remotos que, em seguida, executar tarefas específicas. V-C tem agradáveis ??notificações de status de email construída em tão bem.

Note que este é muito semelhante ao post de Zack sobre o uso de cron local + onda ou cron + wget

http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/ mainwindow / mainwindow_bluetheme.png

Você já usou janelas agendador de tarefas ou o no comando ? É possível utilizá-lo como uma alternativa para cron em UNIX. Você pode (1) escrever um script PHP que executa todas as tarefas necessárias (2) criou um trabalho cron no UNIX ou tarefa agendada no Windows para executar este script via PHP CLI.

Também é possível executar o script através da abertura de HTTP a partir de um computador remoto. A máquina remota pode ser uma caixa UNIX ou Windows. wget pode ser usado em vez de um navegador web e está disponível para ambas as plataformas.

eu optaria por uma máquina segundo servidor / virtual para executar estes tipos de tarefas agendadas. Que segundo servidor pode ser externo e executar outras funções, tais como notificá-lo quando o seu servidor primário não responde, etc.

A propósito, qual é a sua definição de "precisa?"

IMHO, você deve escrever uma camada acima destes métodos ...

User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)

Em seguida, você não tem de implementar todos os métodos, mas se você ou sua necessidade do cliente um novo método ... tudo o que ele tem é de fazer é implementar a interface da tecnologia.

BTW, o "método de execução tecnologia" pode ser escrito como um módulo PHP para uma melhor integração /-sistema host desempenho.

Se eu fosse você, eu iria procurar uma biblioteca / módulo existente, e eu não iria criar um processo de fundo, a menos que o sistema subjacente não pode lidar com tarefas (Unix e Windows não lidar com eles) programado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top