拥抱吉祥 發表於 2019-8-15 16:19:00

PHP通过php-java-bridge调用JAVA的jar包里class类

<p><strong>正 文:</strong></p>
<table style="width: 0" border="0" align="right">
<tbody>
<tr>
<td>&nbsp;</td>

</tr>

</tbody>

</table>
<p>有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法,一般飘易推荐的做法是采用php-java-bridge做桥接,本文就来介绍一下大致的实现方法。</p>
<p>&nbsp;</p>
<p><strong>先简单说下php-java-bridge做桥接的实现原理</strong>:</p>
<p>先打开java的一个监听端口,php调用java的时候,将对应的方法调用转发到java的指定端口,由java执行后再将结果返回给php。这种模式是一种比较典型的代理模式,php在这里成为了一个代理转发器,把java的类调用转发给后端的java执行。</p>
<p>&nbsp;</p>
<p><strong>我们再来看看具体的流程</strong>:</p>
<p>1、下载二进制的 JavaBridge.jar包、java/Java.inc库文件,下载地址:http://php-java-bridge.sourceforge.net/pjb/download.php</p>
<p><img src="http://www.piaoyi.org/upimg/file071127_08/02/2016112210433440.jpg"></p>
<p>注意,当前最新版本是PHP/Java Bridge 6.2.1,但是这个版本也是<strong>2010-10-31</strong>更新的,现在都2016年了,都过去6年了,从这个更新日期来看,源码编译安装的方式只适合在此日期之前发布的PHP版本,比如<strong>PHP 5.3.3</strong>发布日期是<strong>2010-7-22</strong>,但是保守估计,<strong>源码编译安装的方式仅适合PHP 5.2以及更低的PHP版本,</strong><strong>不适合PHP 5.3/PHP 5.4/PHP 5.5/PHP 5.6/PHP 7这些高版本的PHP了,源码编译最高只支持到PHP5.2</strong>。飘易这里不采用源码安装的方式,直接使用二进制包打开监听端口就可以了。</p>
<p>&nbsp;</p>
<p>2、linux下安装java环境,具体安装方法就不说了,搜索下;飘易使用的是java-1.7,留意下环境配置:</p>
<p><strong>文件</strong><strong>&nbsp;</strong><strong>/etc/profile</strong><strong>&nbsp;</strong>末尾添加:</p>
<pre class="brush:bash;toolbar:false">export&nbsp;JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64
export&nbsp;JRE_HOME=$JAVA_HOME/jre
export&nbsp;CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export&nbsp;PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH</pre>
<p>然后,<strong>source /etc/profile</strong>&nbsp;使之立即生效。</p>
<p>PS: 如何找到java安装路径呢?</p>
<p><img src="http://www.piaoyi.org/upimg/file071127_08/02/2016112211143899.png"></p>
<p>3、将JAVA的jar包文件放置在java的库位置&nbsp;$JAVA_HOME/jre/lib/ext/,如</p>
<pre class="brush:bash;toolbar:false">/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/lib/ext/app-security.jar</pre>
<p>&nbsp;</p>
<p>4、在JavaBridge.jar所在目录运行命令(先cd到所在目录)&nbsp;</p>
<pre class="brush:bash;toolbar:false">java&nbsp;-jar&nbsp;JavaBridge.jar&nbsp;SERVLET_LOCAL:8081&nbsp;&amp;</pre>
<p>(加&amp;是让其在后台运行)</p>
<p>或者直接带上日志等级</p>
<pre class="brush:bash;toolbar:false">java&nbsp;-jar&nbsp;JavaBridge.jar&nbsp;SERVLET:8081&nbsp;3&nbsp;JavaBridge.log&nbsp;&amp;</pre>
<p>执行后,我们使用命令<strong>netstat -nltp</strong>,发现linux已经开启了一个8081端口开始监听:</p>
<p><img src="http://www.piaoyi.org/upimg/file071127_08/02/2016112211243618.jpg"></p>
<p>&nbsp;</p>
<p>PS:如果需要开机启用,配置:</p>
<p><strong>/etc/rc.local 添加开机启动</strong></p>
<pre class="brush:bash;toolbar:false">java&nbsp;-jar&nbsp;JavaBridge.jar所在绝对路径&nbsp;SERVLET_LOCAL:8081&nbsp;&amp;</pre>
<p>&nbsp;</p>
<p>5、在web目录下放置&nbsp;Java.inc文件,编写php测试代码 test.php</p>
<pre class="brush:bash;toolbar:false">&lt;?php&nbsp;header(&nbsp;'Content-Type:&nbsp;text/html;&nbsp;charset=UTF-8'&nbsp;);

define("JAVA_DEBUG",&nbsp;true);&nbsp;//调试设置
define("JAVA_HOSTS",&nbsp;"127.0.0.1:8081");&nbsp;//设置javabridge监听端口
/*0:&nbsp;Log&nbsp;nothing,&nbsp;not&nbsp;even&nbsp;fatal&nbsp;errors.
&nbsp;&nbsp;1:&nbsp;Log&nbsp;fatal&nbsp;system&nbsp;errors&nbsp;such&nbsp;as&nbsp;"out&nbsp;of&nbsp;memory&nbsp;error".
&nbsp;&nbsp;2:&nbsp;Log&nbsp;java&nbsp;exceptions.*/
define("JAVA_LOG_LEVEL",&nbsp;2);&nbsp;//java.log_level:&nbsp;0-6

require_once&nbsp;"Java.inc";&nbsp;//php调用java的接口,与该脚本位于同一目录
java_set_file_encoding("UTF-8");&nbsp;//设置JAVA编码。

try&nbsp;{
&nbsp;&nbsp;/*&nbsp;invoke&nbsp;java.lang.System.getProperties()&nbsp;*/
&nbsp;&nbsp;$props&nbsp;=&nbsp;java("java.lang.System")-&gt;getProperties();
&nbsp;&nbsp;
&nbsp;&nbsp;/*&nbsp;convert&nbsp;the&nbsp;result&nbsp;object&nbsp;into&nbsp;a&nbsp;PHP&nbsp;array&nbsp;*/
&nbsp;&nbsp;$array&nbsp;=&nbsp;java_values($props);
&nbsp;&nbsp;foreach($array&nbsp;as&nbsp;$k=&gt;$v)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"$k=&gt;$v";&nbsp;echo&nbsp;"&lt;br&gt;\n";
&nbsp;&nbsp;}
&nbsp;&nbsp;echo&nbsp;"&lt;br&gt;\n";
&nbsp;&nbsp;
&nbsp;&nbsp;/*&nbsp;create&nbsp;a&nbsp;PHP&nbsp;class&nbsp;which&nbsp;implements&nbsp;the&nbsp;Java&nbsp;toString()&nbsp;method&nbsp;*/
&nbsp;&nbsp;class&nbsp;MyClass&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;toString()&nbsp;{&nbsp;return&nbsp;"hello&nbsp;PHP&nbsp;from&nbsp;Java!";&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/*&nbsp;create&nbsp;a&nbsp;Java&nbsp;object&nbsp;from&nbsp;the&nbsp;PHP&nbsp;object&nbsp;*/
&nbsp;&nbsp;$javaObject&nbsp;=&nbsp;java_closure(new&nbsp;MyClass());
&nbsp;&nbsp;echo&nbsp;"PHP&nbsp;says&nbsp;that&nbsp;Java&nbsp;says:&nbsp;";&nbsp;echo&nbsp;$javaObject;&nbsp;&nbsp;echo&nbsp;"&lt;br&gt;\n";
&nbsp;&nbsp;echo&nbsp;"&lt;br&gt;\n";

&nbsp;&nbsp;echo&nbsp;java("php.java.bridge.Util")-&gt;VERSION;&nbsp;echo&nbsp;"&lt;br&gt;\n";

}&nbsp;catch&nbsp;(JavaException&nbsp;$ex)&nbsp;{
&nbsp;&nbsp;echo&nbsp;"An&nbsp;exception&nbsp;occured:&nbsp;";&nbsp;echo&nbsp;$ex;&nbsp;echo&nbsp;"&lt;br&gt;\n";
}</pre>
<p>&nbsp;</p>
<p>6、PHP如何调用自己编写的java类呢?</p>
<pre class="brush:bash;toolbar:false">$Des3&nbsp;=&nbsp;new&nbsp;Java("com.ksoft.security.Des3");&nbsp;//实例
try{&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$Des3-&gt;encode('88290801',&nbsp;$key);
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"&lt;hr&gt;";
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$Des3-&gt;decode('S2JFP23v0zM=',&nbsp;$key);
}
catch(Exception&nbsp;$e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;echo($e);
}</pre>
<p>&nbsp;</p>
<p>【一些注意事项】:</p>
<p>关于PHP-Java-Bridge的各种函数使用:</p>
<p>1、高版本的java_require不再使用,也无法使用,由于放到java虚拟机下面,则不需要再手动引入包文件。</p>
<p>2、java_value()用于获取值,而且必须使用该函数获取值。</p>
<p>(特别注意:如果该值需要存入数据库,那么必须使用该java_value函数,不然会报错,或者无法存入数据库)</p>
<p>3、java_inspect()对实例化或者方法进行print_r类似的输出。</p>
<p>(注:请不要直接使用var_dump这样的输出方法输出java的类、方法、变量,需要使用java_inspect或者java_value,例如:var_dump(java_inspect($abc)))</p>
<p>4、实例化使用 $test = new Java("Test")的方式,如果实例化的方法中存在参数,可以这样new Java("Test","pram")</p>
<p>&nbsp;</p>
<p><strong>提醒</strong>:</p>
<p>1、务必确保对java.inc的引用,确保引用正确</p>
<p>2、务必确保对jar包放在能引用的地方,比如java虚拟机jre下面</p>
<p>3、在PHP中调用Java使用PHP的的写法即可</p>
<p>&nbsp;</p>
<p>【参考】:</p>
<p>1、PHP-Java-Bridge使用笔记</p>
<p>2、PHP-Java-Bridge的使用(平安银行支付功能专版)</p>
<p>3、使用php-java-bridge让PHP5支持java</p>
<p>4、Linux下配置php-java-bridge</p>
<p>&nbsp;</p>
<div class="ggc2">&nbsp;引用自&nbsp;http://www.piaoyi.org/php/php-java-bridge-jar-class.html</div><br><br>
来源:https://www.cnblogs.com/yangjinqiang/p/11358691.html
頁: [1]
查看完整版本: PHP通过php-java-bridge调用JAVA的jar包里class类