PHP não detecta a conexão abortar
Eu li e compreendi profundamente estes:http://www.php.net/manual/en/features.connection-handling.php http://www.php.net/manual/en/function.register-shutdown-function.php
No entanto, eu testei o PHP 5.1.6 e 5.3 e as coisas não funcionam como descrito lá. O que eu observo é:
connection_status () sempre retorna true, mesmo depois que o cliente fechou a conexão.a execução do script continua depois que o cliente fechou a conexão, mesmo que ignore_user_abort seja 0uma função registrada com register_shutdown_function () não é executada até que o script seja finalizado. O script NÃO é interrompido (e, portanto, a função não é chamada) quando o cliente aborta a conexão.Então, basicamente, o PHP simplesmente não detecta a desconexão do cliente.
Observe que isso NÃO é como se ignore_user_abort fosse definido como 1: se esse fosse o caso, connection_status () retornaria 1 mesmo que o script continuasse em execução e a função de desligamento não fosse chamada até o final. Esse não é o caso.
ini_get ("ignore_user_abort") retorna 0, conforme o esperado.
Isso é um bug no PHP, ou isso pode ser devido a alguma configuração do Apache?
Como faço para o PHP funcionar como descrito na documentação acima?
Script de teste:
<?php
function myShutdown() {
error_log("myShutdown ".connection_status()." ".ini_get("ignore_user_abort"));
}
register_shutdown_function(myShutdown);
echo "Hi!";
error_log(" *** test/test *** ");
for ($i=0; $i<10; $i++) {
sleep(1);
error_log(".");
echo ".";
}
?>
Etapas para reproduzir: - visite a URL do script - aborte a conexão no cliente antes de 10 segundos (por exemplo, pressione o botão Parar no navegador)
Comportamento esperado / esperado: Os logs devem mostrar menos de 10 pontos e, no final, "myShutdown 1 0" (se você observar o log em tempo real, o myShutDown deve aparecer imediatamente quando o cliente desconectar)
Comportamento observado / atual: Os logs mostram sempre exatamente 10 pontos, e no final "myShutdown 0 0" (se você assiste em tempo real, ele continua por 10 segundos, não importa quando o cliente desconecta).