企業級應用常需整合 Java 生態(規則引擎、報表、加密庫等)。PHP 官方提供 java 擴展,但因效能與穩定性問題鮮少用於生產;MiniJ2EE 提出 SJOP 協定,將 Java 服務外部化,成為較務實的跨語言整合方案。本文深度對比兩者架構、優缺點與適用場景。
<?php
$system = new Java('java.lang.System');
echo "Java version = " . $system->getProperty('java.version') . "<br>";
?>
不建議用於任何生產環境,僅適合本機快速原型驗證。
minij2ee_fetch_connection() 建立連線,發送方法呼叫請求,Java 端執行後回傳結果。<?php
$conn = minij2ee_fetch_connection();
// 呼叫靜態方法:java.lang.System.getProperty(String)
$version = minij2ee_callstatic_javaobj(
$conn,
'java.lang.System',
'getProperty',
'java.lang.String', // 參數型別
'java.version' // 參數值
);
echo "Java version = $version<br>";
?>
MiniJ2EE 提供 EJB-PHP 編譯器,將 EJB Home/Remote 介面編譯為 PHP 類別,PHP 程式碼如同呼叫本地物件:
<?php
require('Cart.php'); // 編譯器產生的 Proxy
$home = new CartHome(); // Home 介面
$objRef = $home->create($cartName); // 建立 EJB 實例
$cart = new Cart($objRef); // Remote 介面 Proxy
$cart->add('some goods'); // 透過 SJOP 呼叫 Java 端 EJB
?>
| 維度 | Java 擴展 | MiniJ2EE SJOP |
|---|---|---|
| 記憶體佔用 | 高(每 worker 載入 JVM) | 低(PHP 端無 JVM) |
| 穩定性 | 差(JVM Crash 導致 Web Server 掛掉) | 高(Java 端獨立進程,故障隔離) |
| 多載方法支援 | 不支援 | 支援(編譯器生成具體簽名 Proxy) |
| EJB/事務/安全 | 無 | 完整支援 Java EE 標準 |
| 部署複雜度 | 低(僅 PHP 擴展) | 中(需部署 MiniJ2EE 伺服器) |
| 網路延遲 | 無(進程內) | 極低(本機 Unix Socket/Loopback) |
若專案允許引入新基建,建議考慮更通用的跨語言方案:
PHP 呼叫 Java 的歷史演進:java 擴展(進程內)→ MiniJ2EE SJOP(進程外 RPC)→ 現代微服務(gRPC/REST/MQ)。生產環境請直接採用現代微服務架構,MiniJ2EE 可作為無法引入新基建時的過渡方案。核心原則:語言邊界即服務邊界,以網路協定而非進程內呼叫實現互操作。