Silvio Tenfen Junior

Instalando e utilizando múltiplas versões do PHP com PHPBrew no Kubuntu 14.04

Atualizado em 04/08/2015

De vez em quando pode ser necessário realizar a manutenção de um site ou sistema antigo escrito em PHP. Nesses casos, quando você faz download e testa em seu ambiente local acaba se deparando com muitos erros do PHP. Muitos desses erros são devido as diferenças de versões do PHP do ambiente de produção e do ambiente local. Nesses casos, a medida mais recomendada é instalar e rodar o sistema ou site com a mesma versão do PHP do ambiente de produção.

Nesse tutorial ensino a utilização do PHPBrew que permite instalar e utilizar múltiplas versões do PHP. Ele foca na utilização do PHPBrew no Kubuntu 14.04. Como pré-requesito estou considerando que você já tenha seu ambiente local com WAMP instalado e configurado.

Instalando o PHP Brew

Baixe e instale o PHPBrew:

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ sudo mv phpbrew /usr/bin/phpbrew

Configure o PHPBrew:

$ phpbrew init
$ echo "source $HOME/.phpbrew/bashrc" >> ~/.bashrc

Para conhecer as versões do PHP disponíveis para instalar, execute:

$ phpbrew known
Available stable versions:
5.6+ 5.6.0
5.5+ 5.5.17, 5.5.16, 5.5.15, 5.5.14, 5.5.13, 5.5.12, 5.5.11, 5.5.10
5.4+ 5.4.33, 5.4.32, 5.4.31, 5.4.30, 5.4.29, 5.4.28, 5.4.27, 5.4.26
5.3+ 5.3.29, 5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22

Essa lista pode agregar novas versões do PHP. Para obtê-los use:

$ phpbrew update

Você pode compilar o PHP utilizando diversas combinações de variantes. Para listá-las use:

$ phpbrew variants
Variants: 
all, apxs2, bcmath, bz2, calendar, cgi, cli, ctype, curl, dba, debug, dom, 
embed, exif, fileinfo, filter, fpm, ftp, gcov, gd, gettext, gmp, hash, 
iconv, icu, imap, inifile, inline, intl, ipc, ipv6, json, kerberos, libgcc, 
mbregex, mbstring, mcrypt, mhash, mysql, opcache, openssl, pcntl, pcre, 
pdo, pgsql, phar, phpdbg, posix, readline, session, soap, sockets, sqlite, 
static, tidy, tokenizer, wddx, xml, xml_all, xmlrpc, zip, zlib, zts

Virtual variants: 
dbs: sqlite, mysql, pgsql, pdo
mb: mbstring, mbregex
neutral: 
default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc, 
json, mbregex, mbstring, mhash, mcrypt, pcntl, pcre, pdo, phar, posix, 
readline, sockets, tokenizer, xml, curl, openssl, zip
everything: dba, ipv6, dom, calendar, wddx, static, inifile, inline, cli, 
fpm, ftp, filter, gcov, zts, json, hash, exif, mbstring, mbregex, libgcc, 
pdo, posix, embed, sockets, debug, phpdbg, zip, bcmath, fileinfo, ctype, 
cgi, soap, pcntl, intl, phar, session, tokenizer, opcache, imap, tidy, 
kerberos, xmlrpc, pcre, mhash, mcrypt, zlib, curl, readline, gd, icu, 
openssl, mysql, sqlite, pgsql, xml, xml_all, gettext, iconv, bz2, ipc, 
gmp

Observe que você pode usar variantes virtuais como default ou dbs que irão compilar o PHP com um grupo de variantes.

Considerando que queira instalar o PHP 5.3.29 com as extensões padrões, com acesso a bancos de dados (como a extensão mysql), incluindo a extensão soap e iconv e o módulo PHP para o Apache, execute da seguinte maneira:

$ sudo php-5.3.29 +default +dbs +apxs2 +soap +iconv

Observe que esse processo é demorado. O PHPBrew baixa a versão específica do PHP e inicia a compilação dele no seu computador. Fique atento as mensagens de erro que podem acontecer nesse processo. Normalmente por causa de bibliotecas faltantes ou bloqueio de firewall.

Se a instalação terminar com sucesso, você deve visualizar algo como:

Congratulations! Now you have PHP with php-5.3.29.
To use the newly built PHP, try the line(s) below:

$ phpbrew use php-5.3.29

Or you can use switch command to switch your default php version to php-5.4.40:

$ phpbrew switch php-5.3.29

Problemas Comuns na Instalação de uma Versão do PHP

Erro: apsx binary is not executable

Apxs é um binário responsável pela compilação dos módulos do Apache. Instale-o com:

$ sudo apt-get install apache2-dev

Erro: Configured failed. 1

Esse é um erro de configuração. Normalmente acontece por falta de bibliotecas. Utilize o seguinte comando, trocando a versão do PHP abaixo pela versão escolhida e procure erros nas últimas linhas:

$ tail -F /home/silvio/.phpbrew/build/php-5.3.29/build.log

Identificando os erros, instale as bibliotecas solicitadas. No meu caso foi necessário apenas a instalação de uma biblioteca (porque eu já tenho a maior parte delas instaladas):

$ sudo apt-get install libicu-dev

Erro: Failed to connect to www.php.net port 80: Network is unreachable

Pode aparecer o seguinte erro:

$ sudo phpbrew install 5.3.29 +mysql +apxs2
===> phpbrew will now build 5.3.29
You haven't set any variant. A default set of extensions will be installed for the minimum requirement:
[bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc, json, mbregex, mbstring, mhash, pcntl, pcre, pdo, phar, posix, readline, sockets, tokenizer, xml, curl, zip, openssl]
Please run 'phpbrew variants' for more information.

===> Loading and resolving variants...
===> Downloading from http://www.php.net/get/php-5.4.40.tar.bz2/from/this/mirror
Failed to connect to www.php.net port 80: Network is unreachable

Nesse caso, baixe manualmente o código fonte do PHP na URL que aparece acima da mensagem.

$ wget http://www.php.net/get/php-5.3.29.tar.bz2/from/this/mirror

O arquivo deve ser baixado com o nome “mirror”. Altere o nome do arquivo corretamente conforme a URL.

$ mv mirror php-5.3.29.tar.bz2

Agora, mova o arquivo para a pasta do PHPBrew:

$ mv php-5.3.29.tar.bz2 ~/.phpbrew/distfiles/

Rode novamente o comando de instalação:

$ sudo phpbrew install 5.3.29 +mysql +apxs2

Utilizando o PHPBrew

Para utilizar a versão do PHP instalada use:

$ phpbrew switch php-5.3.29

Você pode se certificar que a versão está rodando utilizando o comando:

$ php -v
PHP 5.3.29 (cli) (built: Apr 30 2015 15:43:15)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies

Se precisar listar outras versões do PHP que foram instaladas use:

$ phpbrew list

Para voltar para a versão oficial do PHP na distribuição use:

$ phpbrew off

Configurando o PHP no Apache

Quando você solicita a instalação do PHP com o módulo Apache observe que ele altera automaticamente os arquivos de configuração do Apache para o uso da versão que você escolheu. Para usá-lo, depois de instalado, reinicie o Apache com:

$ sudo service apache2 restart

Mas se você escolher outra versão do PHP usando “phpbrew switch php-5.X.X” ou “phpbrew off” ele não faz essa configuração novamente para você. Você terá que alterar manualmente o arquivo de configuração do Apache. Basta editar o conteúdo do arquivo /etc/apache2/mods-enabled/php5.load:

$ nano /etc/apache2/mods-enabled/php5.load

Onde aparece:

LoadModule php5_module /usr/lib/apache2/modules/libphp5.X.XX.so

Altere conforme a versão do PHP desejado. Para uma versão instalada pelo PHPBrew:

LoadModule php5_module /usr/lib/apache2/modules/libphp5.3.29.so

Para a versão oficial da distribuição:

LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

Salve o arquivo e reinicie novamente o Apache:

$ sudo service apache2 restart

Finalmente, utilize um arquivo com a função phpinfo() e teste no navegador para para se certificar da versão do PHP.

Instalando Novas Extensões

Você ainda poderá instalar outras extensões no PHP. Primeiro selecione a versão do PHP desejada:

$ phpbrew switch php-5.3.29

Teremos que alterar a permissão da pasta .phpbrew para evitar erros de permissão. Utilize seu usuário no lugar de silvio:

$ sudo chown -R silvio:silvio ~/.phpbrew/

Agora execute a instalação da extensão desejada:

$ phpbrew ext install curl

Pode ocorrer erro na instalação.

$ phpbrew ext install curl
===> Installing curl extension...
Log stored at: /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log
Changing directory to /home/silvio/.phpbrew/build/php-5.3.29/ext/curl
===> Phpize...
===> Configuring...
Command failed: ./configure --with-php-config=/home/silvio/.phpbrew/php/php-5.3.29/bin/php-config >> /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log 2>&1 returns

No exemplo acima, basta analisar o arquivo de log que é apresentado. No meu caso:

silvio@kubuntu-ultra:~$ tail -f /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... re2c
checking for re2c version... 0.13.5 (ok)
checking for gawk... gawk
checking for cURL support... yes, shared
checking if we should use cURL for url streams... no
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/

Vimos que falta a instalação da biblioteca do curl. Pesquisando na Internet descobri que o nome certo do pacote para o Kubuntu 14.04 é libcurl4-gnutls-dev. Basta instalar:

sudo apt-get install libcurl4-gnutls-dev

Agora tentamos novamente a instalação.

$ phpbrew ext install curl
===> Installing curl extension...
Log stored at: /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log
Changing directory to /home/silvio/.phpbrew/build/php-5.3.29/ext/curl
===> Phpize...
===> Configuring...
===> Building...
===> Running make all: make -C /home/silvio/.phpbrew/build/php-5.3.29/ext/curl all >> /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log 2>&1
===> Installing...
===> Running make install: make -C /home/silvio/.phpbrew/build/php-5.3.29/ext/curl install >> /home/silvio/.phpbrew/build/php-5.3.29/ext/curl/build.log 2>&1
===> Extension is installed.
===> Creating config file /home/silvio/.phpbrew/php/php-5.3.29/var/db/curl.ini.disabled
===> Enabling extension curl
[*] curl extension is enabled.
Done.

A mensagem [*] curl extension is enabled confirma que a extensão foi instalada com sucesso. Para utilizá-la imediatamente no Apache, reinicie o mesmo:

$ sudo service apache2 restart

Fontes:
http://www.sitepoint.com/use-phpbrew-virtphp/
http://enzolutions.com/articles/2014/10/17/manage-php-versions-with-phpbrew/

Sair da versão mobile