Forum und email

Integração PHP / Java

Introdução

Existem duas maneira possíveis para integrar PHP com Java: você pode ou integrar o PHP a um ambiente Java Servlet , que é a solução mais estável e eficiente, ou integrar suporte Java ao PHP. O primeiro está disponível por um módulo SAPI que faz a interface com o servidor Servlet, o outro faz isso por meio dessa extensão Java.

A extensão Java prove meios simples e eficientes para criar e invocar métodos em objetos Java a partir do PHP. A JVM é criada usand JNI, e tudo roda no mesmo processo.

Aviso

Este módulo é EXPERIMENTAL. Isso quer dizer que o comportamento neste módulo --- incluindo suas funções e seus nomes, e TUDO mais que está documentado sobre esse módulo --- poderá mudar em futuras versões do PHP, SEM QUALQUER NOTIFICAÇÃO. Esteja avisado, e use este módulo por sua própria conta e risco.

Dependências

Você precisa de uma Java VM instalada na sua máquina para usar essa extensão.

Instalação

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

No PHP 4, os fontes desta estensão PECL podem ser encontrados no diretório ext/ ou dentro dos fontes do PHP ou no link PECL acima. Para usar essas funções você deve compilar o PHP com suporte à Java usando a opção --with-java[=DIR] onde DIR aponta para o diretório base de onde o JDK está instalado. Essa extensão só pode ser compilada como uma extensão compartilhada. Outras extensões podem ser encontradas em php-src/ext/java/README.

Usuário do Windows devem habilitar php_java.dll no arquivo php.ini para usar essas funções. No PHP esta DLL reside no diretório extensions/ junto aos binários do PHP para Windows. A DLL para esta extensão PECL deve ser copiada da pagina de » Downloads do PHP ou de » https://pecl4win.php.net/

Nota: Para habilitar esse módulo em um ambiente Windows com o PHP <= 4.0.6, você deve colocar o arquivo jvm.dll no PATH do seu sistema. Nenhuma DLL adicional é necessária para versões do PHP > 4.0.6.

Configurações em execução

O comportamento dessas funções podem ser modificado pelas configurações do php.ini.

Opções de Configuração da extensão de Java
Nome Valor Padrão Alterável Changelog
java.class.path NULL PHP_INI_ALL  
java.home NULL PHP_INI_ALL  
java.library.path NULL PHP_INI_ALL  
java.library JAVALIB PHP_INI_ALL  
Para mais detalhes e definições das constantes PHP_INI_*, veja Diretivas do arquivo php.ini.

Tipos Resource

Esta extensão não possui nenhum tipo resource.

Constantes pré-definidas

Esta extensão não possui nenhuma constante.

Exemplos

Example#1 Exemplo de Java

<?php
// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');

// demonstrate property access
echo 'Java version=' $system->getProperty('java.version') . '<br />';
echo 
'Java vendor=' $system->getProperty('java.vendor') . '<br />';
echo 
'OS=' $system->getProperty('os.name') . ' ' .
             
$system->getProperty('os.version') . ' on ' .
             
$system->getProperty('os.arch') . ' <br />';

// java.util.Date example
$formatter = new Java('java.text.SimpleDateFormat',
                      
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

echo 
$formatter->format(new Java('java.util.Date'));
?>

Example#2 Exemplo de AWT

<?php
// This example is only intended to be run as a CGI.

$frame  = new Java('java.awt.Frame''PHP');
$button = new Java('java.awt.Button''Hello Java World!');

$frame->add('North'$button);
$frame->validate();
$frame->pack();
$frame->visible True;

$thread = new Java('java.lang.Thread');
$thread->sleep(10000);

$frame->dispose();
?>
Notes:
  • new Java() criará uma instância de uma classe se um construtor apropriado estiver disponível. Se nenhum parâmetros for passado e o construtor padrão for utilizável já que prove acesso à classes como java.lang.System que expõe a maior parte de suas funcionalidades através de métodos estáticos.
  • Acessar um membro de uma instância primeiro procurará por uma propriedade bean, depois por campos públicos. Em outras palavras, print $date.time elel primeiro tentará trabalhar com $date.getTime(), depois com $date.time.
  • Tanto membros estáticos como de instância podem ser acessados em um objeto com a mesma sintaxe. Além disso, se o objeto java é do tipo java.lang.Class, membros estáticos da classe (campos e métodos) podem ser acessados.
  • Exceções disparadas resultam em avisos do PHP e em resultados NULL. Os avisos podem ser eliminados prefixando uma chamada de método com um sinal "@". As seguintes APIs podem ser usadas para obter e reniciar o último erro:

  • Resolução de sobrecarga em geral é um problema complicado dada às diferenças nos tipos entre as duas linguagens. A extensão Java aplica uma métrica simples, mas relativamente eficaz, para determinar qual sobrecarga é a melhor. Além disso, nomes de métodos no PHP não são sensíveis ao caso, potencialmente aumentando o número de sobrecargas a serem escolhidas. Uma vez que um método é escolhido, os parâmetros são alterados se necessário, possivelmente com perda de dados (exemplo: números de ponto flutuante de precisão dupla serão convertidos para booleano).
  • Na tradição do PHP, arrays e hashtables podem ser usados de forma alternada. Perceba que hashtables no PHP só podem ser indexadas por inteiros e strings; e que arrays de tipos primitivos em Java não podem ser esparsos. Também note que essas estruturas são passadas por valor, então pode ter custo em termos de memória e tempo.

Java Servlet SAPI

O Java Servlet SAPI é montado em um mecanismo definido pela extensão Java que permite que o processador do PHP seja executado como uma servlet. A vantagem principal disso da perspectiva do PHP é que os servidores web que suportam servlet tipicamente tomam mais cuidado com criação e reuso de JVMs. Instruções de configuração para o módulo SAPI do Servlet podem ser encontrados em php4/sapi/README. Avisos:

  • Embora esse código seja intencionado para ser capaz de rodar em qualquer engine de servlet, ele só foi testado até hoje no Apache's Jakarta/tomcat. Relatos de bugs, estórias de sucesso e/ou patches necessárias para que esse código funcione em qualquer outro engine seriam apreciados.
  • PHP tem o hábito de mudar o diretório de trabalho. sapi/servlet irá, eventualmente, mudá-lo ao anterior, mas enquanto o PHP estiver executando o engine do servlet ele pode não ser capaz de carregar classes do CLASSPATH especifidao usando caminhos relativos, ou achar o diretório de trabalho usado para administração e tarefas de compilação de JSPs.

Índice