Meu script é chamado pelo servidor. Do servidor receberei ID_OF_MESSAGE
e TEXT_OF_MESSAGE
.
Em meu script, tratarei do texto recebido e gerarei uma resposta com os parâmetros: ANSWER_TO_ID
e RESPONSE_MESSAGE
.
O problema é que estou enviando resposta a incomming "ID_OF_MESSAGE"
, mas o servidor que me envia mensagem para tratar irá definir sua mensagem como entregue a mim (significa que posso enviar a resposta para aquele ID), após receber a resposta http 200.
Uma das soluções é salvar a mensagem no banco de dados e fazer algum cron que será executado a cada minuto, mas preciso gerar uma mensagem de resposta imediatamente.
Existe alguma solução como enviar ao servidor a resposta 200 http e continuar executando o script php?
Muito obrigado
header("Content-Encoding: none")
fastcgi_finish_request()
no finalTenho visto muitas respostas aqui que sugerem o uso,
ignore_user_abort(true);
mas este código não é necessário. Tudo isso garante que o script continue em execução antes do envio de uma resposta, caso o usuário aborte (fechando o navegador ou pressionando escape para interromper a solicitação). Mas não é isso que você está perguntando. Você está pedindo para continuar a execução APÓS o envio de uma resposta. Tudo que você precisa é o seguinte:Se você está preocupado com o fato de seu trabalho em segundo plano demorar mais do que o limite de tempo de execução de script padrão do PHP, continue
set_time_limit(0);
no topo.fonte
Se estiver usando o processamento FastCGI ou PHP-FPM, você pode:
Fonte: https://www.php.net/manual/en/function.fastcgi-finish-request.php
Problema de PHP nº 68722: https://bugs.php.net/bug.php?id=68772
fonte
Gastei algumas horas neste problema e vim com esta função que funciona no Apache e Nginx:
Você pode chamar esta função antes de seu longo processamento.
fonte
filter_input
função, ela retorna NULL às vezes. veja esta contribuição do usuário para detalhesModificou um pouco a resposta de @vcampitelli. Não pense que você precisa do
close
cabeçalho. Eu estava vendo cabeçalhos fechados duplicados no Chrome.fonte
Eu uso a função php register_shutdown_function para isso.
http://php.net/manual/en/function.register-shutdown-function.php
Edit : O acima não está funcionando. Parece que fui enganado por alguma documentação antiga. O comportamento de register_shutdown_function mudou desde o link do link do PHP 4.1
fonte
Não consigo instalar o pthread e nem as soluções anteriores funcionam para mim. Descobri que apenas a seguinte solução funcionava (ref: https://stackoverflow.com/a/14469376/1315873 ):
fonte
no caso de uso de php file_get_contents, o fechamento da conexão não é suficiente. php ainda espera por eof witch enviado pelo servidor.
minha solução é ler 'Comprimento do conteúdo:'
aqui está um exemplo:
response.php:
Observe o "\ n" em resposta à linha fechada, se não o fget lido enquanto espera eof.
read.php:
Como você pode ver, este script deve esperar um pouco se o comprimento do conteúdo for atingido.
espero que ajude
fonte
Eu fiz esta pergunta a Rasmus Lerdorf em abril de 2012, citando estes artigos:
Eu sugeri o desenvolvimento de uma nova função embutida do PHP para notificar a plataforma que nenhuma saída adicional (no stdout?) Será gerada (tal função pode cuidar do fechamento da conexão). Rasmus Lerdorf respondeu:
Eu posso ver seu ponto de vista e apoiar sua opinião para algumas aplicações / cenários de carregamento! No entanto, em alguns outros cenários, as soluções de vcampitelli et al, são boas.
fonte
Eu tenho algo que pode compactar e enviar a resposta e deixar outro código php ser executado.
fonte
Existe outra abordagem e vale a pena considerar se você não deseja alterar os cabeçalhos de resposta. Se você iniciar um thread em outro processo, a função chamada não aguardará sua resposta e retornará ao navegador com um código http finalizado. Você precisará configurar o pthread .
Assim que executarmos $ continue_processing-> start (), o PHP não irá esperar pelo resultado de retorno desta thread e, portanto, até onde rest_endpoint é considerado. Está feito.
Alguns links para ajudar com pthreads
Boa sorte.
fonte
Eu sei que é um antigo, mas possivelmente útil neste momento.
Com essa resposta, não apoio a questão real, mas como resolver esse problema corretamente. Espero que ajude outras pessoas a resolver problemas como este.
Eu sugeriria usar RabbitMQ ou serviços semelhantes e executar a carga de trabalho em segundo plano usando instâncias de trabalho . Existe um pacote chamado amqplib para php que faz todo o trabalho para você usar o RabbitMQ.
Profissionais:
Neg's:
fonte