Integração PHP e Java: fácil, porém díficil

Salve.

OBS: Esse post é um relato, porém, pode salvar uma alma-viva que deseja habilitar a integração PHP / Java. Se você for uma dessas almas-vidas, leia tudo ;)

Estava eu na mesmisse de sempre, quando um camarada meu me chamou para algo novo: configurar um servidor apache que rodasse php e esse php tivesse suporte ao Java dentro dele. Achou confuso, pois é, nessa hora eu parei, pensei e disse: "heiiiin ?". Começava assim uma saga!

Ok, aparentemente tudo perfeito. Dia ensolarado, por volta de 11 horas começamos o trampo. Vamos ao perfil:

  • Escritório de desenvolvimento de software.
  • Máquina disponível para o serviço: algum Pentium da vida com uma MoBo Azus
  • Sistema operacional: Fedora Core 5 (Ivan, era isso ? huhuhu)

Mal agente (Ivan e eu) sabiamos que aquele dia, só tinha o solzinho bom, e olha que nem pude aproveita-lo, afinal estava num escritório :S

Instala Fedora nele. Após a instalação zuada (me desculpe quem gosta de Fedora, mas é a real) dele, o sistema iniciou. Beleza. Rede via DHCP, delícia. Ok, fui compilar o PHP, afinal o Apache já encontrava-se instalado.

Primeiro problema: essa coisa feia não possuia o compilador C instalado :S
Solução: Usar um cara chamado Yum para instalar para nós :D
Problema de número 2: Ele precisa atualizar algumas coisas, afinal o GCC depende de outros pacotes. Beleza, instalou a versão mais recente desses pacotes.

Voltei a compilação do PHP e:
Problema de número 3: Sem suporte a CPP e g++. Sem eles, nada de compilação de PHP.
Solução: Usar (ou melhor, tentar, usar) o Yum. Rá, quem dera! O Yum não tinha esses pacotes na base dele. (Noooosa que aplicativo bom, hein ?!)

OK, voltei ao CD do Fedora Core 5 e tentei instalar por lá, afinal a Linux Mall vendeu 5 CD's desse distro para o Ivan, em algum deles deve estar, né ?
Quando eu finalmente achei (cada pedaço em um CD [Nota: Organização 0]) ele não deixava eu atualizar por quê ?? Isso, porque o Yum atualizou o GCC para a versão mais recente.

Preciso comentar que o Apache default do Fedora não trazia o Apxs ? Acho que não né...

Desisto do Fedora. O que mais temos por aqui ?
Sim, nosso colega ao lado possuia os CD's do Debian Sarge, também copiados nos estúdios da Linux Mall :)
Instalação rapidinha tudo lindo. Aaaah agora vai, pensei eu! Pfff, que nada! Apenas o sol estava brilhante lá fora, nada mais era bom.
Problema de número... aaah perdi a conta! O infeliz (para não perder o nível) do APT queria REMOVER o Kernel-ide quando eu simplemente pedi para ele instalar o gcc! Debian User's, me desculpe, mas realmente o APT é uma m*, como o Henrique costuma falar.

Olho no relógio e já são apenas 14 horas. Putzz. Resolvi voltar em casa (que não é tão perto desse cliente) pegar os CD's de duas distros que realmente funcionam! São elas: Slackware e Arch. O resto ? Resto eu diria...

Voltando lá novamente, eu instalo o Slackware 11 com kernel 2.4 na hd sata do cliente. Ok!
Problema de número "n": o hotplug não encontrou o driver da placa de rede.
Solução: # lspci e caçar no kernel o driver. Para uma placa Marvell Gigabit Ethernet, o driver sk98lin (acho que era isso) funcionou perfeitamente, para minha sorte.

Com o Slackware instalado eu instalei o Apache e o PHP, porém, faltava o principal: a integração PHP / Java.

O módulo do PHP
Achou que sofri bastante ? Não estamos nem na metade!

Para começar, o site do PHP.net já diz:

Esta estensão » PECL não vem compilada com o PHP.

Ou seja, pegar o módulo on the fly e compilar a parte para depois carregá-lo dinamicamente no PHP e blablabla blablabla blablabla[..]

O salva almas-vivas
O módulo eu fui encontrar bem depois, logo ali perdido nos comentários dos usuários!
O módulo é o PHP-Java-bridge.

Eu peguei a versão mais recente, em source-code mesmo, para evitar problemas.
Após baixar, basta descompactar e rodar dentro do pacote extraído o comando:

# phpize

Após isso, você pode compilar esse módulo usando:

# ./configure --with-java=/seu/path/para/seu/jdk

Após, rode um:

# make
# make install-modules

Ele vai indicar onde o módulo foi instalado para você. Geralmente em: /usr/lib/php/extensions/php. Verá que dentro desse diretório há o que nós queremos: o java.so.

Com isso, abra seu php.ini e na linha extension_dir="./" mude para:

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/lib/php/extensions/php"

Procure agora pela linha: ;extension=php_mbstring.dll e adicione antes dela:

extension=java.so

E por fim (aí esta a jogada) eu apanhei um bocado para descobrir até que às 1:30 da manhã eu descobri, você precisa alterar também:

[Java]
;java.class.path = .\php_java.jar
;java.home= c:\
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path=c:\

Para:

[Java]
;java.class.path = .\php_java.jar
java.home=/caminho/do/seu/jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
java.library.path=/usr/lib/php/extensions

Salve o arquivo. Reinicie o daemon do Apache. Rode um phpinfo() e procure pelo módulo do Java carregado lá!

integração php/java [img]
(clique para ampliar)

Para ter 100% de certeza do funcionamento, rode um script proposto no site do PHP.net:

PHP:
  1. <?php
  2. // get instance of Java class java.lang.System in PHP
  3. $system = new Java('java.lang.System');
  4.  
  5. // demonstrate property access
  6. echo 'Java version=' . $system->getProperty('java.version') . '<br />';
  7. echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br />';
  8. echo 'OS=' . $system->getProperty('os.name') . ' ' .
  9.              $system->getProperty('os.version') . ' on ' .
  10.              $system->getProperty('os.arch') . ' <br />';
  11.  
  12. // java.util.Date example
  13. $formatter = new Java('java.text.SimpleDateFormat',
  14.                       "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
  15.  
  16. echo $formatter->format(new Java('java.util.Date'));
  17. ?>

Pronto, a integração está concluída.

Tudo, ok senão fosse o cliente requer rodar sua própria JAR
E voltamos novamente a pensar... o que fazer ? Sem meias voltas (apanhamos um bocado para descobrir) a solução foi chamar o jar do cliente usando o java_require()

PHP:
  1. <?php
  2.  
  3. java_require($_SERVER['DOCUMENT_ROOT'] . "/path/para/meu/pacote.jar");
  4.  
  5. $pac = new Java("com.empresa.familia.pacote.Classe");
  6.  
  7. var_dump($pac);
  8. ?>

Sem esquecer que essa integração ficou mais simples pois eu no final das contas, instalei ArchLinux!
Pronto, e assim nossa missão estava finalizada. Cliente satisfeito, e eu volto a minha mesmisse de sempre :)



9 comentários para “Integração PHP e Java: fácil, porém díficil”

  1. David says:

    Vlwwwww!!!!!!!! salvou minha vida (instalei no debian :P )

  2. David says:

    epa, faltou uma coisa (:P) vc sabe como (e se pode) usar swing ou awt do java desta forma??? como por exemplo um jOptionPane??

  3. hlegius says:

    David,
    Realmente eu no cheguei a testar essas possibilidades. Agora fiquei na dvida tambm =) Caso consiga, d um report aqui para ns, ok ? Talvez funcione rodando o script PHP pela linha de comando!

  4. Rmulo Cerqueira says:

    Eu uso o slackware e dentro da pasta do php-java-bridge eu dei o seguinte comando:
    #phpize
    Cannot find config.m4.
    Make sure that you run ‘/usr/bin/phpize’ in the top level source directory of the module

  5. hlegius says:

    Rmulo,
    Muito provavelmente voc baixou um pacote corrompido, ou algo similar, pois pela mensagem de erro ele reclama a falta de um arquivo no pacote java-bridge. Tente baixar novamente o bridge!

    Abrao!

  6. norivan says:

    Agora vamos ver se eu consigo fazer isso no ruindows aqui do escritrio :p

  7. Francis Giongo says:

    Opa!
    Tenho grande interesse de fazer essa integração PHP/Java..
    Gostaria de usar ireports para relatórios em aplicações que utilizam PHP, porém gostaria de fazer os testes e de rodar em ambiente windows!
    Saberia como proceder?
    Grato!

  8. Flávio says:

    Tenho grande interesse de fazer essa integração PHP/Java..
    Gostaria de usar ireports para relatórios em aplicações que utilizam PHP, porém gostaria de fazer os testes e de rodar em ambiente windows!
    Saberia como proceder?
    Grato!

  9. Leonam SOuza says:

    Caro hlegius, obrigado por compartilhar!!!
    Estava procurando por essa info.

Comente !

Get Adobe Flash playerPlugin by wpburn.com wordpress themes