-
TimeOut
não tem efeito em mod_php. -
max_execution_time
afeta apenas o tempo de execução do próprio script. Chamadas do sistema usandosystem()
ouexec()
não contam para o tempo de execução, exceto no Windows.
No Ubuntu 10.10 com Apache2 + php, o script
<?
system("sleep 10000");
?>
não tem tempo limite. Tanto max_execution_time quanto TimeOut não se aplicam.
Existe alguma maneira de garantir que um script seja interrompido?
TimeOut
não tem efeito em mod_php. max_execution_time
afeta apenas o tempo de execução do próprio script. Chamadas do sistema usando system()
ou exec()
não contam para o tempo de execução, exceto no Windows. Com o Apache e o mod_php, você terá um problema aqui. Outros métodos, como carregar o php via fcgid ou fastcgi, proporcionam maior controle sobre o gerenciamento de processos / tempo de execução / timeouts / tempo ocioso / etc.
A resposta de Alvosu está quase certa - mas um pouco concisa.
PHP's sleep () é um invólucro simples sob a API do planejador do sistema operacional. Quando é chamado, o php pára de rodar - então o PHP não pode checar se o relógio está esgotado até que o tempo de suspensão expire e o agendador o adicione de volta à fila de execução, e a CPU processando a próxima instrução.
Embora este exemplo seja bastante artificial (por que você escreveria um script como esse sabendo que você teria um tempo limite em execução), há muitos cenários em que o segmento de execução passa fora do interpretador PHP e, portanto, não obtém uma chance de verificar seu cronômetro - por exemplo quando o script inicia outros processos ou o encadeamento está em uma extensão - como, por exemplo, aguardar uma consulta do db retornar. O problema pode ser evitado pedindo ao sistema para enviar um sinal de volta ao código PHP em um intervalo definido ( pcntl_alarm ) após você define um manipulador de sinal ( pcntl_signal ).
Tags php apache-2.2 ubuntu