Pergunta

Estou interessado em iniciar processos após uma solicitação da Web ou possivelmente formar um novo processo após a conclusão do thread inicial.

Eu preferiria não usar um cron, devido à natureza dos trabalhos que estarei em execução e com que frequência eles precisam ser executados, esperar um minuto para atualizar não é uma opção.

Estou considerando algumas maneiras de fazer isso:

1) Ligar para uma página em JavaScript que inicia o processo e retorna imediatamente, depois executa tarefas depois, por exemplo, ajax ('/run_jobs.php? Job = 123') .... você entendeu a ideia

2) Ferking um novo thread após a conclusão de um tópico; ou seja, output_page (); novo thread (); run_job (123); saída();

Alguém tem alguma idéia sobre o assunto ou tem experiência com isso.

Foi útil?

Solução

Bem, depende do trabalho que você deseja executar. Uma abordagem mais complexa, mas mais escalável e controlável, é usar o Gearman para iniciar e controlar trabalhos. O bom é que você pode distribuir os trabalhos para outras caixas para que seu servidor da Web não obtenha a carga total.

A abordagem fácil é usar o Exec e nohup como em

<?php
exec("nohup /usr/bin/php script.php >/dev/null 2>/dev/null &");
?>

A parte importante é para destacar os canais de saída do processo PHP. Para ler o resultado do processo, você pode armazená -lo em um banco de dados.

Outras dicas

Hoje em dia, a maneira padrão de lidar com esse tipo de coisa é um sistema de fila de mensagens. No final do seu pedido, você envia uma mensagem para a fila. Depois, há algum tipo de processo externo em execução (vários Crons, por exemplo) que estão constantemente lendo mensagens de volta da fila e executando os trabalhos que precisam ser executados

Zend fila é uma escolha popular para PHP.

Quanto às suas soluções propostas, você não pode ter certeza de que uma solicitação de Ajax terminará (o HTTP não garante o sucesso ou o fracasso de uma solicitação); portanto, se você estiver confiando no trabalho em execução. Eu já vi o tipo de trabalho, mas não é a melhor escolha. O marque um processo no final do seu pedido será um pesadelo de desempenho.

Eu não testei isso, mas aqui está uma ideia.

Usando CURL, envie uma solicitação de forma assíncrona para newprocess.php (ou onde quer que seu novo script de processo esteja localizado.) Você pode olhar para a função curl_post_async em Como faço para fazer uma solicitação assíncrona no PHP? sobre como fazer tal solicitação.

Você pode querer fazer alguma autenticação para garantir que somente você pode disparar newprocess.php ...

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