Pergunta

Temos um grande software de gestão que está a produzir grandes relatórios de todos os tipos, com base em numerosos loops, com recuperações de banco de dados, objetos criações (muitos), e assim por diante.

No PHP4 poderia correr alegremente com um limite de memória de 64 MB - agora temos mudou-se em um novo servidor e com a mesma base de dados - mesmo código, os mesmos relatórios não virá sem um show de limite de memória. ..

Eu sei que PHP5 mudou sob o capô um monte de coisas, mas há uma maneira de torná-lo comportar?

A questão no final é, quais as estratégias que você se aplicam quando você precisa ter seus scripts em uma dieta?

Foi útil?

Solução

Um grande problema que temos executado em era referências circulares entre objetos impedindo-os de memória liberando quando eles se tornam fora do escopo.

Dependendo de sua arquitetura que você pode ser capaz de usar __destruct () e manualmente desactivado quaisquer referências. Para o nosso problema acabei reestruturação das aulas e remover as referências circulares.

Outras dicas

Quando eu preciso otimizar recursos em qualquer roteiro, eu tento sempre analisar, perfil e depurar o meu código, eu uso xdebug , eo xdebug Profiler , existem outras opções como APD e Referência Profiler .

Além disso, eu recomendo que você este artigos:

Desde que se mudou para o novo servidor, você verificou se suas variáveis ??do sistema MySQL e PHP são idênticos aos do jeito que estavam em seu servidor antigo?

PHP5 introduziu uma série de novas funcionalidades, mas devido ao seu mantra compatibilidade com versões anteriores, eu não acredito que as diferenças entre PHP5 e PHP4 deve estar causando isso grande um efeito sobre o desempenho de uma aplicação que é de código e banco de dados não foi alterado.

Você também está sendo executado na mesma versão do Apache ou IIS?

Parece um problema que é mais provável relacionado ao seu novo ambiente de sistema do que para uma atualização do PHP4 a 5.

Bertrand,

Se você está interessado em refatoração do código existente, então eu recomendo que você monitore o seu primeiro uso de CPU e de memória durante a execução de relatórios. Você está travando seu servidor SQL ou você está travando Apache (que acontece se um monte de estresse está sendo colocado no sistema pelo código PHP)?

Eu trabalhei em um projeto que, inicialmente, atolados MySQL tão severamente que nós tivemos que refazer todo o processo de geração de relatórios. No entanto, quando nós terminamos a carga foi simplesmente transferida para Apache (através do código PHP mais complexo). Nossa solução final foi refatorar o design de banco de dados para fornecer para um melhor desempenho de funções de relatório e usar o PHP para pegar a folga sobre o que não podíamos fazer nativamente no MySQL.

Dependendo da natureza dos relatórios que você pode considerar desnormalizar os dados que está sendo usado para os relatórios. Você pode até considerar a construção de um segundo banco de dados que serve como um armazém de dados e é projetado em torno de princípios OLAP em vez de princípios OLTP. Você pode começar a Wikipedia para uma explicação geral do OLAP e armazenamento de dados.

No entanto, antes de começar a olhar para refatoração sério, você tem verificado que os seus ambientes são suficientemente semelhantes, olhando para phpinfo (); para PHP e SHOW VARIABLES; no MySQL?

Um show!?!

até 64MB é grande.

ignorando a discrepância entre os ambientes, (que faz som muito peculiar), parece que o código pode precisar de algum re-factoring.

acaso você pode re fator de seu código para que os conjuntos de resultados de consultas de banco de dados não são despejados em arrays. Eu recomendaria que você construir um iterador para seus conjuntos de resultados. (Dali você pode tratá-los como matriz para a maioria dos propósitos) .não é uma grande diferença entre lidar com um registro de cada vez, e manipulação de 10.000 registros de cada vez.

Em segundo lugar, ter um olhar para o tempo seu código é a criação de várias instâncias de dados. você pode passar os objetos por referência. (use o '&'). Tivemos que fazer uma coisa semelhante quando se utiliza uma variante início do quadro horda. um anexo de 1 MB iria soprar para 50MB de inúmeras chamadas que passaram todo o conjunto de dados como uma cópia, e não como uma referência.

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