Eu dei uma olhada no consumo de memória do Wordpress. No meu site, parece que, para cada página atingida, 20 MB de RAM são alocados, apenas para preparar um ambiente confortável para a execução de todos os plugins.
Não há um único local para otimizar, nenhum bandido que consome a maior parte da memória. O consumo está espalhado por muitos módulos php.
Como podemos fazer com que o Wordpress inicialize seu ambiente na memória apenas uma vez e depois reutilize-o várias vezes para cada ocorrência? Eu não quero que o PHP lento coma 20 MB a cada clique do usuário - mesmo em um servidor com muita memória, leva segundos para que todo o trabalho seja feito. Basicamente, você precisaria de blocos de memória somente leitura que possam ser reutilizados.
Além disso ... por que 20MB? Alguém pode fornecer informações sobre isso?
Edit: Aqui está a saída WinCacheGrind no Wordpress em execução na minha máquina de desenvolvimento (muito mais rápido que a hospedagem compartilhada). Como você pode ver, são necessários mais de um segundo para produzir o HTML da página principal. Retarde isso com hospedagem compartilhada e você terá uma receita para problemas. Eu escolhi o método que leva a maior parte do tempo. Como você otimizaria isso?
Edit: Aqui estão as estatísticas da consulta desta fantástica ferramenta de criação de funções functions.php .
Carga: 12 consultas - 532ms - 19,1MB - 43 ocorrências em cache / 53 Consulta: 15 consultas - 563ms - 19,0MB - 72 ocorrências em cache / 86 Exibição: 21 consultas - 705ms - 19,2MB - 234 ocorrências de cache / 257
Edit: Você quer ver algo garantido para te assustar? Insira estas linhas no final do index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
Tentei contar quantas vezes o corpo do post atual está armazenado na memória. Eu contei 20 instâncias. Então eu percebi que o PHP tem contagem de referência, então a quantidade de cópias reduzida para apenas três: duas parecem estar no WP_Query, uma no cache do objeto. Estou investigando mais.
É por isso que acho que o WordPress precisa de refatoração visando os problemas de memória. Você não pode mais culpar o consumo de memória pela simples complexidade do que faz. Simplesmente faz um monte de coisas erradas .
Edit: Depois de um dia tentando descobrir isso, aqui estão as minhas conclusões:
1) 88% de toda a memória vem de exigir ou incluir ou incluir um tipo de chamada:
2) O arquivo php inclui acontece principalmente durante a primeira parte do atendimento de uma solicitação (sem surpresa), que também é onde toda a memória é consumida:
3) É bastante interessante plotar todas as funções que estão sendo executadas durante a solicitação. Existem mais de 12000 chamadas no total. Eu os instalei para torná-lo mais visível (o eixo Level é basicamente a profundidade da pilha):
4) O único caminho a seguir em que consigo pensar é em minimizar a quantidade de arquivos .php incluídos. Se eu dividir as funções por arquivo de onde elas vieram, você poderá ver que muitos arquivos são atingidos uma ou duas vezes, no máximo. Precisamos de uma maneira de pular aqueles quando não são necessários. Por exemplo, meu plug-in de backup de banco de dados remoto é carregado e registrado, apenas para nunca ser usado. Aqui está o gráfico acima dividido pelo nome do arquivo:
Estou oferecendo uma recompensa que vale toda a minha reputação :) por refatorações que levariam a reduzir a pegada de memória dos meus blogs em 30% ou mais.
Edit: Eu instalei o WP 3.1, aqui está a comparação com a versão antiga.
Azul é WP 3.1, vermelho é 3.0.4. O novo WP é mais rápido, mas também consome mais memória.
Aqui está uma lista por arquivo de inclusão.
Isso me permite perceber quanta memória é consumida pelo "All In One SEO pack" - uma avenida seria usar apenas uma fração da funcionalidade do plug-in para obter o que eu quero. Além disso, meus próprios plugins parecem muito ruins.
Eu gostaria de tentar o carregamento condicional em, por exemplo, comment.php (não aceito comentários no meu blog) e vários outros. Eu apaguei todo o código obsoleto. Eu reduzi o kses.php para carregar apenas suas tabelas globais sob demanda. Simplifiquei l10n (não localizo), fazendo com que suas funções retornem as strings imediatamente, sem pesquisas. Ainda estou longe da marca de 30% que estabeleci arbitrariamente.
Editar: baixei e habilitei o APC com configurações padrão (32 MB de cache de código de operação). Aqui está a comparação:
Você pode ver que o carregamento do código acelerou enormemente, e o código também ocupa menos espaço na memória (provavelmente porque lidamos apenas com códigos de operação, não com a fonte original). O consumo de memória ainda é bastante alto.