Compilação no Magento: como funciona e porque usar?

Olá pessoal!

Há algum tempo venho recebendo dúvidas sobre como melhorar (um pouco) a performance do Magento sem precisar comprar módulos que prometem fazer sua loja rodar na velocidade da luz (sim, existem desenvolvedores que prometem isso).

Minha visão aqui é simples: O Magento é um dos melhores softwares para e-commerce da atualidade, porém uma plataforma bastante pesada que demanda grandes recursos de servidores.

Para mim não existe fórmula mágica, afirmar que existe um módulo milagroso que vai resolver todos os problemas de performance do Magento sem afetar suas funcionalidades e dinâmica é um conto de fadas.

Ao menos a nível de módulo de cache do Magento eu não acredito. Seria outro assunto se estivéssemos falando do Varnish, uma poderosa ferramenta de cache para web, porém que faz parte de infraestrutura e não de software.

Enfim, não sei até onde isto é conhecido em nossa comunidade, mas o Magento possui implementado em suas funcionalidades padrão algo que pode ajudar em sua performance: a compilação. Pode ser encontrada em System > Tools > Compilation.

Para se compilar os arquivos no Magento basta seguir um processo muito simples: Navegue até System > Tools > Compilation e clique em Run Compilation Process e aguarde a finalização do processo.

Para que serve?

A compilação no Magento tem por finalidade ‘juntar’ todos os arquivos de classes de todos os seus módulos do Magento em uma única pasta, que fica localizada em /includes/src/.

Este processo diminui o tempo de resposta para cada arquivo que o Magento tente incluir em seu processo de Autoload, pois ele deixa de varrer as pastas padrão dos módulos um a um para procurar qualquer arquivo necessário em uma única pasta, citada acima.

Habilitar a compilação é uma boa jogada para um ganhho de performance, porém mais adiante relatarei algumas precauções que são necessárias para que este benefício seja usufruído causar erros na loja.

Como funciona?

Analisando o index.php do Magento Community em sua versão 1.7.0.2 podemos destacar o seguinte trecho de código que vai da linha 42 á linha 50:

/**
 * Compilation includes configuration file
 */
define('MAGENTO_ROOT', getcwd());

$compilerConfig = MAGENTO_ROOT . '/includes/config.php';
if (file_exists($compilerConfig)) {
 include $compilerConfig;
}

Basicamente no início de cada request o Magento analisa se existe o arquivo /includes/config.php, que existirá apenas quando rodamos a compilação pela primeira vez e o qual possui duas linhas de códito sendo a segunda comentada:

define('COMPILER_INCLUDE_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'src');
#define('COMPILER_COLLECT_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'stat');

Esta primeira linha é, basicamente, o comando que ativa e desativa a compilação no Magento, pois ela indica que todos os arquivos source do Magento estão dentro da pasta /includes/src/, fazendo com que o Magento não mais procure os arquivos de seus módulos nas pastas /app/code/[local|community|core].

Muito cuidado!

No processo de compilação do Magento ele varre todas as classes de todos os módulos e cria uma cópia dos arquivos fonte necessários para o perfeito funcionamento de cada módulo da loja. Dessa forma ele para de buscar os arquivos dos módulos em suas pastas padrão e passa a buscá-los na pasta citada acima.

Em caso de módulos novos que serão instalados na loja existem alguns passos necessários para que não ocorra nenhum problema:

1 – Desabilite a compilação do Magento antes de fazer a instalação do módulo;
2 – Faça a instalação do módulo, seja ela da maneira que for: via Magento Connect ou manualmente;
3 – Rode novamente a compilação do Magento para que ele reconheça e capture os arquivos necessários do novo módulo.

Seguindo estes passos muito provavelmente não existirão erros após a instalação, a menos que o módulo não esteja desenvolvido da maneira correta, mas aí é outra história e eu deixarei para outro tópico, ok?

Um grande abraço e até a próxima!

Tiago Sampaio

14 Comments

  1. Olá,
    Através de um outro tópico tentei fazer a “compilação”.
    A primeira coisa quefiz foi clicar em “ativar” … pelos vistos já fiz besteira ai… seria preciso correer primeiro e só depois ativar.

    Acontece que agora tanto o front como o back office ta off cheio de mensagens de erro do ficheiro app/mage.php

    Pode dar uma ajuda como eu “volto atras”?

    Obg!

    • consegui … tirando o # do config.php … e ja deu para entrar no backoffice outra vez e rodar direito a compilação.

      • desculpa .. tirando não .. acrescentando o #

        fica assim o config sys:
        # define(‘COMPILER_INCLUDE_PATH’, dirname(__FILE__).DIRECTORY_SEPARATOR.’src’);

        acrescentei. consegui entrar de novo no backoffice, depois rodei e ativei a compilação funcionou bem.

        o config sys voltou a ficar sem o # na 1ª linha, mas a funcionar bem a compilaçao.

    • Olá Marcelo,

      Que bom que você conseguiu ‘se virar nos 30’.
      A maneira que você fez para desabilitar a compilação no Magento quando der algum problema é a melhor solução.

      Um grande abraço!!

      Tiago Sampaio

  2. descobri em parte o problema ou melhor a causa do problema. Se a compilacao do magento estiver ativada ele da esse erro.
    Fatal error: require_once() [function.require]: Failed opening required ‘/boleto_php/boleto_itau.php’ (include_path=’/home/bikes869/public_html/includes/src:.:/usr/lib/php:/usr/local/lib/php’) in/home/bikes869/public_html/app/code/community/Mage/BoletoBancario/controllers/StandardController.php on line 120
    Se nao tiver gera o boleto normalmente.
    agora a pergunta. Porque da o erro com o modo compilacao do magento ativado? Como resolver?

    • Olá Fábio,

      Muito provavelmente você está tendo este problema, pois instalou o módulo de boleto com a compilação ativada e não rodou ela novamente. Ou se não o seu módulo não foi desenvolvido dentro das boas práticas do Magento e o arquivo boleto_itau.php não está sendo considerado como uma classe do Magento. Isso é primordial para que a compilação funcione no Magento.
      Caso seu problema seja o primeiro que eu indiquei, simplesmente desative a compilação e rode-a novamente. Caso seja o segundo contacte o desenvolvedor do módulo para que ele lhe dê suporte.

      Um abraço,

      Tiago Sampaio

  3. Olá Thiago, vi seu post e achei muito interessante.

    Atualmente trabalho com magento na área de front-end somente, através de implementações CSS/JS.
    O que você indica, para eu começar a entender a estrutura do core direitinho, saber os dispatch events, e como funciona essa ferramenta internamente?

    Recomenda algum caminho?
    Gostaria de saber, para futuramente tentar tirar uma certificação inicial.

    Abraço

  4. Olá Thiago

    Eu li seu post, com atenção, e tentei usar a compilação, mas como você avisou, um dos módulos, o do PagSeguro/BrunoAssarise, deu erro e eu tive de voltar atras e desligar a compilação.

    Você por acaso saberia se é possível ajustar esse módulo para a compilação? Aparentemente é o arquivo de frete que retorna erro se a compilação está ligada.

    Caso não seja possível, qual o grau de complexidade para substituir o módulo do Bruno pelo seu novo módulo com a API do PagSeguro?

    Meu problema é que a loja do cliente está em pleno funcionamento, e não posso ficar ‘testando” e voltando atras, e correndo o risco de travar a loja toda, nem tirar a mesma do ar para a implantação por muito tempo..:-)

    Você daria suporte para essa migração? Com um custo claro.:-)

    E o modulo anterior, sem uso da API (com PHP mesmo), seria mais seguro, ou mais simples de substituir o do Bruno, para permitir a compilação?

    Um abraço.

    Homero

    • Homero,

      Primeiramente eu sempre aconselho a NÃO testar nada em produção. Para um deploy seguro é sempre preciso ter um ambiente de homologação para estes tipos de testes e correções.
      Sim, é possível fazer com que o módulo do Bruno Assarisse entre nas regras da compilação, porém para isso é necessário alterar alguns arquivos.
      O meu módulo API não dá conflito com o módulo do Bruno Assarisse, mas o anterior sim.

      Abraços,

      Tiago Sampaio

  5. jordan gevaerd Reply

    olá Tiago, boa noite.

    Muito bom o seu post, sou novo no magento.
    Migramos para uma plataforma magento a poucos dias, porém estamos com um problema no checkout, como trabalhamos com atacado, o número de itens normalmente é grande. E ao finalizar o pedido, o checkout fica carregando, pensando e simplesmente não sai dessa, timeout do checkout e trava tudo. porém o pedido não aparece no gerenciador e ainda para piorar, dá baixa no estoque.
    O que podemos fazer para que isso não aconteça, mudar servidor? ou seria alguma configuração que pode vir a agilizar o tempo de checkout?

    Para compras com menos itens conseguimos finalizar, mesmo demorando até 15 segundos o checkout.

    abraços.

  6. Ericc Antunes Reply

    Tiago, valeu pelo conteúdo! Mas ler esse texto com a fonte desse tamanho e cinza no branco ta osso! rs

    Abs!

Leave A Reply

Navigate