Pergunta

A primeira vez que configurar o meu script para ser executado mesmo após a solicitação HTTP é longo

 ignore_user_abort(true);

então expulsar algum texto.

 echo "Thats all folks!";
 flush();

Agora, como posso enganar o navegador em pensar a solicitação HTTP é longo? para que eu possa continuar a fazer meu próprio trabalho, sem o navegador mostrando "carregamento da página".

 header(??) // something like this?
Foi útil?

Solução

Aqui está como fazê-lo. Você diz ao navegador para ler os primeiros caracteres N de saída e feche a conexão, enquanto o seu script mantem o funcionamento até que seja feito.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

Outras dicas

Os cabeçalhos não vai funcionar (eles são cabeçalhos, então eles vêm início )

Eu não sei de nenhuma maneira de fechar a conexão http sem terminar o roteiro, embora eu suponho que há alguma maneira obscura de fazê-lo.

Dizendo-nos o que você quer fazer após o pedido é feito nos ajudaria a dar melhores sugestões.

Mas, geralmente, eu estaria pensando sobre uma das seguintes opções:

1) Execute um script de linha de comando simples (usando exec ()) que se parece com:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Em seguida, chutar que fora de seu roteiro http-bound como:

<?PHP
exec('/path/to/my/script.sh');
?>

Ou:

2) escrever um outro programa (possivelmente um daemon continuamente em execução, ou apenas algum script que é cronned sempre tão frequentemente), e descobrir como seu código em solicitação pode passar instruções. Você poderia ter uma tabela de banco de dados que filas de trabalho, ou tentar fazê-lo funcionar com um arquivo plano de algum tipo. Você também pode ter sua chamada roteiro baseado na web alguns comando de linha de comando que faz com que seu fora de pedido script para a fila de algum trabalho.

No final do dia, você não deseja seu script para manter a execução após a solicitação HTTP. Supondo que você estiver usando mod_php, isso significa que você vai estar amarrando-se um processo de apache até que os termina script.

Talvez este comentário particular sobre php.net página do manual vai ajudar: http://www.php.net/manual/en/features.connection-handling.php#71172

Teoricamente, se HTTP 1.1 é keep-alive habilitado eo cliente recebe a quantidade de caracteres que espera do servidor, ele deve tratá-lo como o fim da resposta e ir em frente e processar a página (mantendo a conexão ainda . aberta) Tente enviar esses cabeçalhos (se você não pode permitir-lhes uma outra maneira):

Connection: keep-alive
Content-Length: n

Onde n é a quantidade de caracteres que você enviou no corpo da resposta (buffer de saída pode ajudar você contar isso.) Eu sinto muito que eu não tenho o tempo para testar isso mesmo. Estou apenas jogando na sugestão em caso ele funciona.

A melhor maneira de fazer isso é usando o buffer de saída. PHP envia os cabeçalhos quando é bom e pronto, mas se você quebrar a sua saída para o navegador com ob_ * Você pode controlar os cabeçalhos em cada passo do caminho.

Você pode manter uma página processada no buffer se você quiser e enviar cabeçalhos até o sol nascer na China. Esta prática é por isso que você pode ver um monte de tags de abertura <?php, mas há marcas de fechamento hoje em dia. Ele mantém o script de envio de quaisquer cabeçalhos prematuramente desde que não poderia algum inclui a considerar.

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