Como você define o tempo máximo de execução do componente CLI do PHP?

6

Como você define o tempo máximo de execução do componente CLI do PHP? Eu tenho um script CLI que entrou em um loop infinito e não sei como matá-lo sem reiniciar. Eu usei o quicksilver para iniciá-lo, então não posso pressionar control + c na linha de comando. Eu tentei executar ps -A (mostrar todos os processos), mas o php não está aparecendo nessa lista, então talvez ele tenha expirado por conta própria - mas como você define manualmente o limite de tempo?

Eu tentei encontrar informações sobre onde eu deveria definir a configuração max_execution_time , estou acostumado a configurar isso para a versão do PHP que roda com o apache, mas não tenho idéia de onde configurá-lo para a versão do PHP que vive em /usr/bin .

Eu vi a seguinte citação, que parece ser precisa (veja a imagem abaixo), mas ter um tempo de execução ilimitado não parece ser uma boa ideia.

Keep in mind that for CLI SAPI max_execution_time is hardcoded to 0. So it seems to be changed by ini_set or set_time_limit but it isn't, actually. The only references I've found to this strange decision are deep in bugtracker (http://bugs.php.net/37306) and in php.ini (comments for 'max_execution_time' directive). (via http://php.net/manual/en/function.set-time-limit.php)

ini_set('max_execution_time') não tem efeito. Eu também tentei a mesma coisa e segui o mesmo resultado com set_time_limit(7) .

Atualizar

Portanto,parecehavertrêsmaneirasdeconseguirisso:

Noscript:

set_time_limit(10);//thiswayini_set('max_execution_time',10);//orthisway

Ouaochamaroscript:

php-dmax_execution_time=5script.php

Pararesponderminhaperguntasobreondeoarquivophp.iniseriacarregado,seriade/etc/php.iniseeleexistir.Essearquivotambémprecisaserlegívelpelousuárioqueestáexecutandooscriptphp,entãoseelefoicriadopelorooteumusuárionãopode"ler", isso significa que o php provavelmente não pode "ler" também.

No entanto, parece que qualquer max_execution_time definido em /etc/php.ini na verdade não afetará os scripts da CLI - mesmo que o arquivo esteja sendo carregado corretamente (use phpinfo() para descobrir) - então você deve usar um dos outros métodos mencionado acima.

Em relação ao uso de um loop de sono para testar isso, aprendi que não funcionará.

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running

Confira uma pergunta muito semelhante no Stack Overflow: link

    
por cwd 23.06.2011 / 15:19

2 respostas

4

No topo do seu código PHP,

ini_set('max_execution_time',300);

ou

set_time_limit(300);

Tem certeza de que está entrando em um loop? Se o segmento de execução passou fora do PHP em uma extensão (ou em outro lugar), então isso não terá efeito.

Uma solução melhor seria o finalizar o script em um cão de guarda

    
por 23.06.2011 / 15:33
1

Em seu script de teste, você usou sleep(5) para testar a execução longa, mas isso não é um teste válido.

Os documentos para o tempo máximo de execução dizem isso:

The maximum execution time is not affected by system calls, stream operations etc.

e os documentos para set_time_limit () dizem o seguinte:

Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

Se você evitar a chamada do sistema de suspensão, set_time_limit(5); deve funcionar bem em scripts de CLI. Aqui está um script de teste que deve sair depois de 5s:

<?php
set_time_limit(5);

$start = time();
$last = 0;

for ($i=0;$i>=0;$i++) {
    if ($i%10000==0) {
        $took = time()-$start;
        if ($took!=$last) {
            echo "taken {$took} s so far...\n";
            $last=$took;
        }
    }
}
php timeout_test.php 
taken 1 s so far...
taken 2 s so far...
taken 3 s so far...
taken 4 s so far...
taken 5 s so far...
PHP Fatal error:  Maximum execution time of 5 seconds exceeded in /home/tom/MailChap/timeout_test.php on line 8
PHP Stack trace:
PHP   1. {main}() /home/tom/MailChap/timeout_test.php:0
    
por 15.06.2013 / 10:50