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/
A sessão Configurando o PHP no Apache resolveu meu problema, muito obrigado!