PHP 5.2 x PHP 5.3 na mesma máquina com xdebug e virtualbox

Saudações

Pra falar a verdade eu não gostei desta solução mas algumas me pessoas pediram, esse site ainda está meio sem conteúdo então vou descrever a solução porca que estou usando para rodar um PHP 5.2 e um PHP 5.3 na mesma máquina.

Tudo começou quando fui chamado para coordenar uma equipe de desenvolvimento e alguns dos projetos rodavam usando PHP 5.2 e outros PHP 5.3 (das máquinas utilizadas para desenvolver umas rodam Ubuntu 11.10 outras 10.04 e algumas o 9.10).

Se precisar ficar meter a mão no código de um projeto PHP 5.2 é fácil, só fazer o downgrade e boa eu também já sabia como fazer o downgrade (outra hora eu publico como fiz mas por enquanto tentem o google) publicado aqui. Se precisar meter a mão no código de um projeto PHP 5.3 também era fácil, tirava as travas e upgrade na instalação. Porém é um saco ficar configurando a toda hora que muda a instalação do PHP: php.ini, variáveis debug (erros, notices, warnings), tamanhos de upload, memória utilizada, memcache, apc, gd, ssl xdebug, curl, cli, etc, etc, etc…

Eu e outro coordenador tentamos juntos durante alguns dias compilar fontes e montar diferentes soluções onde instalações de php bem personalizadas e definir em cada virtual host qual versão de interpretador seria utilizado, e funcionou, mas só em ubuntu 32 bits.

Apelamos e fizemos o seguinte:

Baixamos o pacote de instalação do VirtualBox direto pelo site (no dia a versão era 4.1.8).

Instalamos o VirtualBox

    dpkg -i virtualbox-4.1_4.1.8-75467~Ubuntu~oneiric_amd64.deb

Adicionamos o usuário da máquina ao grupo do virtual box

    sudo adduser nomedeusuario vboxusers

Baixamos a versão server do Ubuntu 9.10 (Karmic)

    wget -c http://old-releases.ubuntu.com/releases/karmic/ubuntu-9.10-server-amd64.iso

é, usamos a de 64 bits mesmo.

Criamos uma máquina virtual no VirtualBox com a imagem baixada e ligamos ela.

Como o Karmic é uma versão antiga não mais suportada então alteramos o source.list para apontar para os servidores antigos. Na máquina virtual usamos o comando

    sed -i "s/br\.archive/old-releases/g" /etc/apt/source.list

(atenção se você não instalou a localidade como brasil altere manualmente o arquivo) e

    sed -i "s/security\.ubuntu/old-releases\.ubuntu/g" /etc/apt/source.list

para corrigir os fontes. Basicamente trocamos os fontes de br.archive.ubuntu para br.archive.ubuntu para old-releases.ubuntu e security.ubuntu para old-releases.ubuntu

Atualizamos os fontes

    sudo apt-get update

Instalamos os pacotes

    sudo apt-get install aptitude build-essential ssh openssl curl memcached apache2 php5 php5-cli php5-mysql php5-memcache php5-memcached php-apc php5-xdebug php5-gd php5-curl php5-dev

Apesar de usar bancos MySQL nos projetos não instalamos na máquina virtual, ficou mais fácil apontar os fontes para buscar o banco na instalação da máquina real.

Durante esse último passo um nespresso vai muito bem.

Após a instalação criamos uma pasta na máquina virtual para colocar os projetos

    sudo mkdir -p /var/www/php52

Alteramos o dono da pasta

    sudo chown nomedeusuario:www-data /var/www/php52

Alteramos o php.ini com as configurações que precisávamos, verifique quais as opções que você vai precisar nesse passo.

    sudo vim /etc/php5/apache2/php.ini

As opções que alteramos foram: short_open_tag = Off, memory_limit = 128M, error_reporting = E_ALL, display_errors = On, log_errors = On, html_errors = On, entre outros…

Preparamos o VirtualHost do projeto que vai rodar nesse servidor “virtual”. Normalmente eu crio um arquivo para cada VirtualHost mas isso é uma preferencia pessoal.

    sudo vim /etc/apache2/sites-available/site_a_ser_instalado

com o conteúdo:

    <VirtualHost *:80>
        ServerAdmin     email@dominio.tst
        ServerName      dominiodositequeinstalei.inet
        ServerAlias     www.dominiodositequeinstalei.inet
        DocumentRoot    /var/www/php52/dominiodositequeinstalei
        <Directory /var/www/php52/dominiodositequeinstalei/>
                Options FollowSymLinks
                AllowOverride   All
        </Directory>
        ErrorLog        ${APACHE_LOG_DIR}/dominiodositequeinstalei.inet.error.log
        CustomLog       ${APACHE_LOG_DIR}/dominiodositequeinstalei.inet.access.log combined
    </VirtualHost>

Ativamos o site

    sudo a2nsite site_a_ser_instalado

Ativamos o módulos que precisaremos no projeto.

    sudo a2enmod rewrite

Neste projeto em particular só utilizamos o mod rewrite

Neste momento anotamos os ips da máquina real e da máquina virtual. Vamos supor que 1.1.1.7 seja da máquina real e 1.1.1.8 seja a máquina virtual.

Na máquina virtual alteramos a configuração do xdebug

    sudo vim /etc/php5/apache2/conf.d/xdebug.ini

Deixando da seguinte maneira:

    zend_extension=/onde/esta/o/arquivo/xdebug.so
    xdebug.remote_enable=1
    xdebug.remote_host=1.1.1.7
    xdebug.remote_port=9000
    xdebug.remote_handler=dbgp

A primeira linha normalmente já vem com o caminho correto, é só adicionar as demais linhas colocando o ip da máquina real na linha do remote host.

Por último na máquina virtual é só reiniciar os serviços, no nosso caso apache e memcache, mas é provável que só o apache bastaria

    sudo /etc/init.d/apache2 restart

Na máquina real alteramos o arquivo de host para encaminhar as chamadas no domínio criado

    sudo vim /etc/hosts

No final do arquivo adicionamos a linha abaixo com o ip da máquina virtual e o domínio que criamos no virtualhost:

    1.1.1.8 dominiodositequeinstalei.inet

Ainda na máquina real criamos uma pasta para manipular o site

    sudo mkdir -p /var/www/php52

Alteramos o dono da pasta

    sudo chown nomedeusuario:www-data /var/www/php52

Instalamos suporte para o sshfs

    sudo apt-get install sshfs

Carregamos o módulo fuse

    sudo modprobe fuse

Adicionamos o usuário ao grupo fuse

    sudo adduser nomedeusuario fuse

Alteramos o dono do dispositivo fuse

    sudo chown root:fuse /dev/fuse

E montamos a pasta da máquina virtual na máquina real

    sshfs nomedeusuario@1.1.1.8:/var/www/php52 /var/www/php52

Atenção para montar a pasta da máquina real TEM que estar vazia, senão vai dar merda.

Pronto coloquei o projeto dentro da pasta php52 (/var/www/php52/dominiodositequeinstalei) e comecei a trabalhar nas correções. Nem precisei mudar nada no netbeans, na hora que rodo o debug o navegador carrega o site hospedado na máquina virtual e o xdebug da máquina virtual faz o meio campo me devolvendo linha a linha no netbeans da máquina real usando a porta 9000.

Ainda vou tentar fazer rodar versões diferentes de PHP na mesma máquina sem precisar de máquina vitual, afinal como dizia meu supervisor de estágio Ricardinho anos atrás: “- Isso não é gambiarra, é um ajuste técnico.”

té +

Se quiser xingar, xinga nos comments aqui em baixo