PHP通往JAVA的橋接器使用

lijianlin0204發表於2020-09-02

橋接器是什麼?

PHP與JavaBridge是在PHP和Java之間搭建一座橋樑利用這周橋樑在兩個實體之間建立起一個溝通渠道,在這座橋樑的幫助下,你可以在Java中開發類,然後在PHP中呼叫它們的方法,同樣,在你的Java桌面或Web應用程式中也可以使用PHP指令碼。
具體詳細說明參考:php-java-bridge.sourceforge.net/pjb...
簡易理解就是,想要在PHP中呼叫java相關的方法!

使用場景

一般筆者在使用橋接器的情況下有兩種情況,一種是PHP和JAVA之間進行加解密服務提供,當PHP難以模擬JAVA加密解密方式時,JAVA方提供加解密jar包供第三方使用,恰巧第三方為PHP,那麼橋接器就派上用場了,另一種就是,JAVA有很多實用的第三方包,可以透過橋接器拿來使用!

如何使用JavaBridge?

1、本地服務或liunx安裝jdk,參考:www.kancloud.cn/lijianlin/jishulli...
2、下載PHP依賴檔案,Java.inc和JavaBridge.jar,下載地址:php-java-bridge.sourceforge.net/pjb...
3、使用方式
在php程式碼中引入Java.inc檔案(一定得絕對路徑)
程式碼示例:

<?php

namespace icbcjoin\src\icbc;

// 引入Java.inc檔案
require_once(env('extend_path') . "icbcjoin/src/icbc/java/Java.inc");
// use icbcjoin\src\icbc\BaseIcbc;
use icbcjoin\src\icbc\Common;


// class Icbc extends BaseIcbc
class Icbc {}

找到存在JavaBridge.jar包的目錄下,開啟他

java -jar JavaBridge.jar SERVLET_LOCAL:8081 &

4、呼叫JAVA的jar包
呼叫java裡面的類,就和php例項化控制器類似

$InternetHaipeUtils = new \Java('com.abcd.internetdecryption.util.InternetHaipeUtils');
// 透過 new \Java()方法去例項化,然後呼叫裡面的方法使用php箭頭方式代替java裡面的點模式即可了
KeyPairParam rsaKeyPair = InternetHaipeUtils.getRsaKeyPair();
String privateKey = rsaKeyPair.getPrivateKey();
String publicKey = rsaKeyPair.getPublicKey();

// 以上java程式碼示例
// php如何呼叫實現
// 初始化他
 $InternetHaipeUtils = new \Java('com.abcd.internetdecryption.util.InternetHaipeUtils');
$privateKey  = $InternetHaipeUtils->getPrivateKey(); // 將點模式轉換成->模式即可
// 那如果初始化的例項中需要帶入構造引數,如何例項化?
new EncryptRequestParam(content, publicKey, privateKey)

// 筆者百度沒找到,很苦惱,如何指的看原始碼才發現很簡單
// 只需要 new \Java(類名,構造引數,構造引數2,...,...) 即可實現
new \Java(
    'com.abcd.internetdecryption.param.EncryptRequestParam',
    $apigw_data,
    $sign, 
    $this->_icbc_key
)

異常解決

筆者在做這件事的時候,也是感覺很簡單,很順利,然後呢?還有什麼要講的麼?
當然,畢竟玩的是別人的jar包,如果jar報錯了,怎麼辦?我還想程式繼續執行,我只是想著調jar包失敗而已,告訴錯誤就好了,別把我程式給關了,如何解決?
筆者使用的是簡單粗暴的方案解決的,直接使用error_reporting(0);忽略jar包裡面的錯誤!
那麼error_reporting(0);放在那裡呢?如果放在全域性肯定不行,放在類中也不行,放在函式的第一行也不行,因為如果放在上面會將你可能需要丟擲的錯誤也忽略掉了,所以筆者採用如下方案完美解決

try {
            $InternetHaipeUtils = new \Java('com.abcd.internetdecryption.util.InternetHaipeUtils');
            $decryptContent = (string)$InternetHaipeUtils->decrypt(
                new \Java(
                    'com.abcd.internetdecryption.param.DecryptRequestParam',
                    $apigw_data,
                    $sign, 
                    $this->_icbc_key
                )
            );

        } catch (\Exception $e) {
            error_reporting(0);
            return [
                'status' => false,
                'timestamp' => date('Y-m-d H:i:s'),
                'pub_code' => '42000',
                'message' => '簽名驗證失敗',
            ];
        }

結語

還有什麼是PHP不能幹的!伺服器shell指令碼直接幹他!HTML直接幹他!JAVA照樣幹他!哈哈!!!

PS:PHP是世界上最好的語言沒有之一!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章