Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Max_execution_time real para PHP no linux


Este é um conselho bastante complicado, mas definitivamente fará o que você deseja, se você estiver disposto a modificar e recompilar o PHP.

Dê uma olhada no código fonte do PHP em https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c (o arquivo é Zend/zend_execute_API.c ), na função zend_set_timeout . Esta é a função que implementa o limite de tempo. Veja como funciona em diferentes plataformas:

  • no Windows, crie um novo thread, inicie um cronômetro nele e, quando terminar, defina uma variável global chamada timed_out para 1, o núcleo de execução do PHP verifica esta variável para cada instrução, então sai (muito simplificado)

  • no Cygwin, use itimer com ITEMER_REAL, que mede real tempo, incluindo qualquer sono, espera, o que for, então levante um sinal que interromperá qualquer processamento e parar o processamento

  • em outros sistemas unix, use itimer com ITIMER_PROF, que mede apenas o tempo de CPU gasto pelo processo atual (mas tanto no modo usuário quanto no modo kernel). Isso significa que esperar por outros processos (como MySQL) não conta para isso.

Agora o que você quer fazer é mudar o temporizador no seu Linux de ITIMER_PROF para ITIMER_REAL, o que é claro que você precisa fazer manualmente, recompilar, instalar etc. A outra diferença entre esses dois é que eles também usam sinal diferente quando o temporizador é executado Fora. Então minha sugestão é mudar o ifdef:
#   ifdef __CYGWIN__

para dentro
#   if 1

para que você defina tanto ITIMER_REAL quanto o sinal que o PHP espera para SIGALRM.

De qualquer forma, toda essa ideia não foi testada (eu a uso para algum sistema muito específico, onde ITEMER_PROF está quebrado e parece para trabalhar), sem suporte, etc. Use-o por sua conta e risco. Pode funcionar com o próprio PHP, mas pode quebrar outros módulos, em PHP e no Apache, se por qualquer motivo, usar o sinal SIGALRM ou outro temporizador.