Resolvendo problema do apc_fetch em php 7

Introdução

Neste breve post, vou mostrar como resolver o problema do apc_fetch no php 7. Aqui na empresa trabalhamos agora com php 7 e ao fazer a instalação o doctrine recebemos a seguinte mensagem de erro:

[Symfony\Component\Debug\Exception\UndefinedFunctionException]                  
  Attempted to call function "apc_fetch" from namespace "Doctrine\Common\Cache".

Este problema aconteceu em instalações de php 7 e ubuntu 16.04 que fizemos. Pesquisando um pouco vemos que o suporte ao apc no php 7 foi descontinuado, por isso, se sua aplicação precisa usá-lo, você deve instalar o módulo de compatibilidade do apcu, chamado apcu_bc.

Solução

A solução completa consiste em 3 passos: Instalar o php-apcu, compilar APCu Backwards Compatibility Module e, por fim, configurar o apache para usar este módulo de compatibilidade.

Vamos aos passos:

1 – Instale o php_apcu:

$ sudo apt-get install php-apcu

2 – Compile o apcu_bc (modo de compatibilidade do apcu para o apc)

Este pacote está hospedado no github. Veja os passos para compilar:

$ git clone https://github.com/krakjoe/apcu-bc.git

$ cd apcu-bc

$ sudo apt install php7.0-dev

$ phpize

$ ./configure

$ make

$ sudo make install

A saída final do terminal deve ser:

Installing shared extensions:     /usr/lib/php/20151012/

Ou seja, a instalação do módulo apc.so foi feita na pasta de módulos padrão do php em /usr/lib/php/20151012/

3 – Modifique o php.ini do Apache e do Cli

Para isso, adicione as seguintes linhas no php.ini em /etc/php/7.0/apache2/php.ini:

extension=apcu.so
extension=apc.so

Modifique também o php.ini do cli em /etc/php/7.0/cli/php.ini:

extension=apcu.so
extension=apc.so

Atenção: É fundamental carregar primeiro o apcu.so para somente depois carregar o apc.so

Resultado final

Reinicie o apache e voalá! Seu phpinfo() deve retornar algo parecido com isto:

apc e apcu com php 7

E seu clearcache no symfony deve funcionar 100% agora.

Clear cache symfony funcionando corretamente com apc

É isto, espero que tenha sido útil.

2 Comments

Leave a Reply