Pergunta

Estou portando um grande aplicativo da web para um ambiente de hospedagem compartilhada.O aplicativo foi escrito em PHP 4.O novo ambiente possui PHP 5.2.

Por alguma razão, o aplicativo está vazando uma enorme quantidade de memória ao ser executado no PHP 5.2.Posso literalmente observar o uso de memória disparando usando memory_get_usage(), até atingir o limite de 64 MB (o que é muito generoso em um ambiente compartilhado, o site costumava rodar com 12 ou 16 MB no PHP 4).

Eu suspeito que isso seja um efeito colateral de algo que mudou no PHP 5, provavelmente o tratamento de referências de objetos em argumentos.No entanto, a busca pelo(s) comportamento(s) específico(s) que causa(m) o vazamento é extremamente difícil, pois o aplicativo é muito complexo e, em parte, não muito bem escrito (sim, é meu).

Como o aplicativo está instalado em um espaço web compartilhado, não posso usar os recursos clássicos de depuração (até onde eu sei).Eu gostaria muito de evitar a recriação do ambiente localmente, pois estou trabalhando no projeto literalmente o dia todo há algum tempo.

Então minhas perguntas são:

  • Alguém conhece as armadilhas típicas de transição do PHP4 => 5, especialmente ao lidar com grandes quantidades de objetos, que podem ser a causa do(s) meu(s) vazamento(s)

  • Alguém conhece algum tipo de ferramenta de "despejo de escopo gráfico" independente de depurador e somente script para as variáveis ​​usadas pelo PHP que possa me ajudar a descobrir quais variáveis ​​estão consumindo essas enormes quantidades de memória?

Foi útil?

Solução

Para resolver esse problema eu faria:

  1. Crie o perfil do script com xdebug+wincachegrind (ou algum outro criador de perfil) e/ou firephp.
  2. Ative o modo STRICT para obter todos os erros + avisos de php.

Fazendo isso, você será capaz de:

  • Otimize seu código.(Remover os erros/avisos/avisos pode acelerar seu código)
  • Limpe seu código.(Usar a sintaxe adequada do objeto php5 só pode ser bom para o desempenho).

O modelo de objeto mudou totalmente de PHP4 para PHP5.Com certeza, o modo STRICT dirá que você não deve usar um "passado por referência" explícito.

Outras dicas

Um problema comum que encontrei em uma versão 5.2 foi que strtotime vazou sem que memory_get_usage o detectasse.Mudar para strptime corrigiu o problema.

Há um relatório de bug para isso para 5.2.8 - http://bugs.php.net/bug.php?id=46889.

Sem o depurador você pode abrir um script que você acha que usa muita memória e colocar a função memory_get_usage em locais críticos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top