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:

[php]
/**
* Compilation includes configuration file
*/
define(‘MAGENTO_ROOT’, getcwd());

$compilerConfig = MAGENTO_ROOT . ‘/includes/config.php’;
if (file_exists($compilerConfig)) {
include $compilerConfig;
}
[/php]

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:

[php]
define(‘COMPILER_INCLUDE_PATH’, dirname(__FILE__).DIRECTORY_SEPARATOR.’src’);
#define(‘COMPILER_COLLECT_PATH’, dirname(__FILE__).DIRECTORY_SEPARATOR.’stat’);
[/php]

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 thoughts on “Compilação no Magento: como funciona e porque usar?

  1. Marcelo

    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!

    Like

      1. Marcelo

        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.

        Like

  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?

    Like

    1. 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

      Like

  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

    Like

  4. Homero

    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

    Like

    1. 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

      Like

  5. jordan gevaerd

    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.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s