Flávio Silveira Programação & Desenvolvimento

  • BLOG
  • SOBRE
  • PORTFOLIO
  • CONTATO

Erro 500, Timeout Apache, max_execution_time PHP

December 26th, 2008  |  Published in Apache, Php, Servidor  |  3 Comments

Cenário: Site que funciona como um painel do cliente, onde ele adiciona produtos que necessita para seu negócio. Há uma área onde de um lado é listado os produtos já adicionados, e do outro os que ele ainda pode adicionar.

Ocorrência: “Sempre demorou para carregar. Funcionava normal. Mas agora quando um cliente tem muitos produtos, não abre. Dá erro 500.”
“No servidor de testes está funcionando, no do ar não. ”

Pesquisa: Fui atrás do tal erro 500. Claro já havia o visto antes, mas não sou daqueles que sabe de cor o significado dos erros de servidor e do apache, e nem dos bips de erro da placa mãe. No segundo cérebro há muitas inconstantes sobre o erro 500. Uns dizem ser erro de permissão, outros de configuração. Felizmente meu Delicious me salvou. Eu tinha salvo esse link com uma lista sobre os erros de servidor há algum tempo.

Agora sim. Erro 500: Algo não foi compreendido pelo servidor.
Certo. Muito bom. Não ajudou muito. Em nada melhor dizendo.
E agora?

Eu e a programadora responsável pelo job, dando uma andada pelo sistema, nos deparamos com uma Consulta SQL cavalar, com várias linhas, Joins e com funções recursivas.

Primeiro chute: Inspirado pelo nosso supervisor de desenvolvimento, vamos ver o Timeout do apache. Vamos comparar o timeout dos dois servidores. Como fazer isso ?
No arquivo de configuração do apache (http.conf no Apache ou apache2.conf no Apache2) você deve encontrar uma linha com o seguinte comentário e em seguida a declaração da variável como abaixo.

#
# Timeout: The number of seconds before receives and sends time out.
#
    Timeout 300

300 é o default da configuração. E é assim que estava setado nas duas máquinas. Não foi dessa vez.

Segundos passos: Eu e a Analista de sistemas já estavamos nos preparando para fazer backups dos arquivos do ar e subir os do servidor de teste. Afinal, estava funcionando local, não adiantava ficar rodando o código e dando print() e print_r() pra tudo quanto é lado. O que você faria ?

Mas foi quando um dos técnicos da TI ganhou a tarde. Mudou o max_execution_time no arquivo de configuração do PHP, o php.ini.
O que é isso ?
O nome diz tudo não ? É o máximo de tempo que o PHP vai tentar ficar executando um script.
Onde arrumo isso ? No php.ini, você vai encontrar as variáveis de Limites de recurso, como abaixo.
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
;max_input_nesting_level = 64 ; Maximum input variable nesting level
memory_limit = 16M ; Maximum amount of memory a script may consume (16MB)

Repare, aqui na minha configuração está com 30. Esse é o padrão. O Parceiro da TI setou para 60.

Testando: Olha só, o Cliente que tem mais de 100 produtos agora consegue entrar na sua lista. Apesar da demora. Xiiii…. mas o cliente com 500 produtos não. :(

Solução: Sim, é isso mesmo. Vamos aumentar mais ainda o max_execution_time.
Qual o máximo que podemos setar ? Segundo dizem, os monges shaolins já ficaram esperando por 8 horas a execução de um script PHP, para exercitar a paciência. Talvez não tenha limite, você pode testar e me dizer.
Resolveu ? Resolveu! Setamos para 300. Apesar da absurda demora (O loading do IE7 se manteve firme por aproximadamente uns 3 a 4 minutos), apareceu a lista de itens do cliente. O cliente não reclama mais que não aparece, apenas da demora.

Próximos passos: Estudar uma melhor performace para essa SQL. Ela parece ser a grande vilã de tudo. Conseguimos uma solução imediata. Nunca e jamais ideal.
Como conseguir essa melhor performance ? Particularmente não sei. Refazer a consulta sem tantos JOINS ou quebrar em partes podem ser algumas alternativas.

Fica aqui o meu relato de algumas horas de trabalho. Quem sabe surge esse problema por ai né?
Abraços.

Compartilhe
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • MySpace
  • PDF
  • RSS
  • Twitter
  • email

Posts Relacionados

  • CodeIgniter: Use a Global $_SERVER no config para ganhar dinamismo com subdomínios.

Comentários

Feed
Trackback
  1. Fabio Tomio disse:

    January 5th, 2009 at 04:54 (#)

    Faaala Flavio, antes de tudo, como foram as festas? Feliz ano novo.
    Entao, foi legal a busca que vc fez para conseguir solucionar o seu problema, mas qual banco vc esta rodando? Lembro como se fosse ontem a professora de banco de dados falando de consultas do tipo Full Table Scan, o famoso SELECT * FROM table, essa consulta e abominada por DBAs, nao e o seu caso, e? Te conhecendo tenho certeza que nao, entao vamos pra segunda possibilidade, valide quais colunas vc precisa e coloque somente elas por exemplo SELECT nome, sobrenome, idade, email FROM ususarios, isso ajuda muito, se ja esta assim, podemos melhorar o desempenho do banco indexando os colunas da tabela que sao utilizadas constantemente nas clausulas WHERE, por exemplo, SELECT nome, email, telefone FROM usuarios WHERE sexo like M AND cidade like Curitiba, nesse exemplo poderiamos indexar no banco as colunas sexo e cidade para que o banco fizesse o load desses dados para a memoria e nao precisasse consultar os dados utilizando o I/O do HD, ele primeiro trabalharia com os dados na memoria e depois iria pegar no disco os dados ja sabendo seu endereco, poupando I/O e melhorando a performance. So nao faca idexacao de todas as colunas, isso pode prejudicar a performance do banco em vez de melhorar, faca um levantamento das principais colunas utilizadas no WHERE.

    Abraco…

  2. admin disse:

    January 5th, 2009 at 19:28 (#)

    Grande Cara…Valeu pelo comment..

    Então, nesse caso estamos falando de Microsoft Data Base..

    A consulta era entupida de Joins a torto e direita. Particularmente eu não olhei muito pra ela. Era bem grande, e como o pessoal tinha pressa, se eu fosse parar para entender cada tabela, cada campo enfim, acho q não era o caminho….

    O pessoal deve estar trabalhando para dar uma limpada nessa consulta, a minha participação foi meramente como uma espécie de analista nesse caso. Se o job voltar para mim, concerteza vou ter q me empenhar em cima do banco de dados e ver o que está acontecendo…

    Valeu !!!

  3. Mozart Petter disse:

    January 6th, 2009 at 03:25 (#)

    E viva as SQL’s mal feitas. Sem dúvida o problema de lentidão aí é isso, vide experiências anteriores com um certo sistema de relatórios que levava 1 ano para trazer os resultados… :)

    E vamos escrever mais porra, esse post é do ano passado!

Deixe um comentário

Flávio Silveira

Programação & Desenvolvimentominha foto

Rss Logo Twitter Logo

Blogroll

  • Aurélio Marinho Jargas
  • Fábio Tomio
  • Mozart Petter
  • Renie Siqueira
  • Willian Rodriguez

Tags & Categorias

add-ons Adobe Air Adobe Flash Builder Adobe Flex Apache apple arrays Banco de Dados CodeIgniter complementos Configuração PHP debug Desenvolvimento Mobile erro 500 erros de servidor Expressões Regulares facilidade formatação via sql Forms framework php geração de cadastros Geração de formulários Internet Explorer não salva session iphone ipod touch Jquery Mobile Layouts mozart petter mozilla firefox multiple site múltiplos sites com codeIgniter Php PHP Sc Conf PodCast postgres Programação em geral reestruturando CodeIgniter Regex Replace Shell Site Mobile smarty SQL Sql Server Template engine Tempo de sessão codeIgniter Adobe (1)
Adobe Air (1)
Adobe Flash Builder (1)
Apache (1)
Banco de Dados (4)
Browsers (2)
CodeIgniter (7)
Expressões Regulares (1)
IPhone – Desenvolvimento (2)
JavaScript (1)
Mobile (1)
Php (10)
Podcast (1)
Programação em geral (12)
Programação SQL (4)
Screencast (1)
Servidor (1)
Shell Script (1)

WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.



©2010 Flávio Silveira
Powered by WordPress adapted of Gridline Lite of author Graph Paper Press.