php调用自己java程序的方法详解


Posted in PHP onMay 13, 2016

本文实例讲述了php调用自己的java程序实现方法。分享给大家供大家参考,具体如下:

最开始要装jdk这个就不用说了,我装的是java ee 5+jdk

1.把下载的php-java-bridge_5.2.2_j2ee.zip解压出来,里面有个JavaBridge.war 直接用winrar打开,到WEB-INF/lib/JavaBridge.jar 把这个jar包拷到 你的php目录的ext/下。

2.打开war包,里面有个java的文件夹,把他全部拷到你的PHP项目下,如/demo/java

3.目前的版本是VMBridge了,要php调用java类,要先启动JavaBridge,

命令行下调用java ?jar JavaBridge.jar或者双击JavaBridge.jar,在弹出的窗口中选择监听端口8080

为了以后启动方便,我在ext/下新建了一个bat文件内容如下:

@echo off
start javaw -jar JavaBridge.jar

保存后,双击启动 会有一个提示框选择vmbridge port 默认8080,直接点ok就行了

4.在/demo/下新建test.php内容如下:

<?php
require_once("java/Java.inc");
header("content-type:text/html; charset=utf-8″);
// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');
$s = new Java("java.lang.String", "php-java-bridge config…<br><br>");
echo $s;
// demonstrate property access
print 'Java version='.$system->getProperty('java.version').' <br>';
print 'Java vendor=' .$system->getProperty('java.vendor').' <br>';
print '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");
print $formatter->format(new Java('java.util.Date'));
?>

5.启动apache,在浏览器中查看 http://localhost/demo/test.php

会看到如下信息:

php-java-bridge config…

Java version=1.6.0_10

Java vendor=Sun Microsystems Inc.

OS=Windows Vista 6.0 on x86

星期日, 十一月 23, 2008 at 4:31:49 下午 中国标淮时间

自定义JAR:

package ttt;
public class phptest{
 /**
 * A sample of a class that can work with PHP
 * NB: The whole class must be public to work,
 * and of course the methods you wish to call
 * directly.
 *
 * Also note that from PHP the main method
 * will not be called
 */
 public String foo;
 /**
 * Takes a string and returns the result
 * or a msg saying your string was empty
 */
 public String test(String str) {
  if(str.equals("")) {
   str = "Your string was empty. ";
  }
  return str;
 }
 /**
 * whatisfoo() simply returns the value of the variable foo.
 */
 public String whatisfoo() {
  return "foo is " + foo;
 }
 /**
 * This is called if phptest is run from the command line with
 * something like
 * java phptest
 * or
 * java phptest hello there
 */
 public static void main(String args[]) {
  phptest p = new phptest();
  if(args.length == 0) {
   String arg = "";
   System.out.println(p.test(arg));
  }else{
   for (int i = 0; i < args.length; i++) {
    String arg = args[i];
    System.out.println(p.test(arg));
   }
  }
 }
}

生成为JAR,拷贝到D盘下。

/demo/index2.php

<?
require_once("java/Java.inc");
java_require("D://1.jar");
$myj = new Java("ttt.phptest");
echo "Test Results are <b>" . $myj->test("Hello World") . "</b>";
$myj->foo = "A String Value";
echo "You have set foo to <b>" . $myj->foo . "</b><br>\n";
echo "My java method reports: <b>" . $myj->whatisfoo() . "</b><br>\n";
?>

在浏览器中查看 http://localhost/demo/index2.php

方法二:php_java.dll 需要配置php.ini,新版的php-java-bridge都没有dll文件

首先确定你的PHP和Apache伺服器及JDK(or JRE也可)都已安装完成

上网下载php-java-bridge(自行找戴点 or http://sourceforge.net/project/showfiles.php?group_id=117793 )

将下载回来的 php-java-bridge解压缩,解压后文件夹里会有一个JavaBridge.war,再同样将这个JavaBridge.war解压缩(win rar即可解)
解压后可从 WEB-INF文件夹里的cgi文件夹找到java-x86-windows.dll,及WEB-INF文件夹里的lib文件夹找到JavaBridge.jar

将java-x86-windows.dll和JavaBridge.jar ?制到PHP的外挂文件夹(我这边是C:/AppServphp/ext),并将java-x86-windows.dll改成php_java.dll

修改php.ini档案

如果php.ini原本没有以下内容,请自行加上,如果原本就有以下内容,请修改成如下[我使用的是JDK]

extension=php_java.dll

[Java]
;java.java = "C:\jdk1.6.0_13\bin\java"
java.class.path = "D:\php\ext\JavaBridge.jar;c:\myclasses" c:\myclasses可自定义,用来存放自己写的JAVA文件 
java.java_home = "C:\jdk1.6.0_13\jre"
java.library = "d:\jdk1.2.2\jre\bin\server\jvm.dll"
java.library.path = "D:\php\ext"

重新起动Apache,查看phpinfo

java
java support  Enabled
java bridge  3.0.8
java.java_home  C:\jdk1.6.0_13
java.java  C:\jdk1.6.0_13\bin\java
java.log_file  <stderr>
java.log_level  no value (use backend's default level)
java.ext_java_compatibility  Off
java command  C:\jdk1.6.0_13\bin\java -Djava.library.path=D:\php\ext -Djava.class.path=D:\php\ext/JavaBridge.jar -Djava.awt.headless=true php.java.bridge.JavaBridge INET_LOCAL:0 2
java status  running
java server  9267

看倒数第二项 java status的状态是不是not running (这是因为你没有启动JavaBridge.jar)。如果变成running <—-代表JavaBridge.jar已启动,已可正式使用php-java-bridge

如果没有启动则执行:

因为不可能每次开机都手动去启动JavaBridge.jar

所以我们写一个批处理,内容如下

@echo off
start javaw -jar JavaBridge.jar

把它存成phpJavaBridge.bat,同样放在PHP的外挂文件夹里(这里是C:AppServ/php/ext)

把该档建立捷径,把建立好的捷径放到启动里(这里是C:/Documents and Settings/All Users/「开始」/功能表/程序启动)

这样一来,以后每次开机后就会自动启动C:AppServphpext 文件夹里的phpJavaBridge.bat

简单范例

<?
$system=new Java('java.lang.System');
echo "java版本".$system->getProperty('java.version')."<BR>";
echo "发行厂商".$system->getProperty('java.vendor')."<BR>";
echo "作业系统版本".$system->getProperty('os.name')."<BR>";
echo "java版本".$system->getProperty('os.version')."<BR>";
echo "java版本".$system->getProperty('os.arch')."<BR>";
?>

或者在php-java-bridge中找到test.php,http://localhost/test.php查看效果

<?php
$system=new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>";
?>
[java]
extension=PHP_java.dll
java.library.path=c:webPHP4extensions
java.class.path="c:webPHP4extensionsjdk1.2.2PHP_java.jar;c:myclasses"

在PHP.INI中加入extension=PHP_java.dll,并在[java]中,设定好java.class.path,让它指向 PHP_java.jar,如果你使用新的JAVA类,你也应该存入这个路径,在这篇例子中,我们使用c:myclasses这个目录。

测试环境,创建如下PHP文件:

<?php
$system = new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>n";
print "Java vendor=".$system->getProperty("java.vendor")." <p>nn";
print "OS=".$system->getProperty("os.name")." ".
$system->getProperty("os.version")." on ".
$system->getProperty("os.arch")." <br>n";
$formatter = new Java("java.text.SimpleDateFormat","EEEE,
MMMM dd, yyyy 'at' h:mm:ss a zzzz");
print $formatter->format(new Java("java.util.Date"))."n";
?>

如果你正确安装了,你将会看到以下信息:

Java version=1.2.2

Java vendor=Sun Microsystems Inc.

OS=Windows 95 4.10 on x86

Wednesday, October 18, 2000 at 10:22:45 AM China Standard Time

理解如何调用JAVA很重要,下一步我们就要创建自己的JAVA文件,让PHP来调用,JAVA文件的java.class.path很重要

创建和使用你自己的JAVA类 [注意大小写]

创建你自己的 JAVA 类非常容易。新建一个 phptest.java 文件,将它放置在你的 java.class.path 目录下【 c:\myclasses】,文件内容如下:

public class phptest{
 /**
 * A sample of a class that can work with PHP
 * NB: The whole class must be public to work,
 * and of course the methods you wish to call
 * directly.
 *
 * Also note that from PHP the main method
 * will not be called
 */
 public String foo;
 /**
 * Takes a string and returns the result
 * or a msg saying your string was empty
 */
 public String test(String str) {
  if(str.equals("")) {
   str = "Your string was empty. ";
  }
  return str;
 }
 /**
 * whatisfoo() simply returns the value of the variable foo.
 */
 public String whatisfoo() {
  return "foo is " + foo;
 }
 /**
 * This is called if phptest is run from the command line with
 * something like
 * java phptest
 * or
 * java phptest hello there
 */
 public static void main(String args[]) {
  phptest p = new phptest();
  if(args.length == 0) {
   String arg = "";
   System.out.println(p.test(arg));
  }else{
   for (int i = 0; i < args.length; i++) {
    String arg = args[i];
    System.out.println(p.test(arg));
   }
  }
 }
}

创建这个文件后,我们要编译好这个文件,在 DOS 命令行使用 javac phptest.java 这个命令。

为了使用 PHP 测试这个 JAVA 类,我们在web目录下创建一个 phptest.php 文件,内容如下:

<?php
$myj = new Java("phptest");
echo "Test Results are <b>" . $myj->test("Hello World") . "</b>";
$myj->foo = "A String Value";
echo "You have set foo to <b>" . $myj->foo . "</b><br>\n";
echo "My java method reports: <b>" . $myj->whatisfoo() . "</b><br>\n";
?>

如果你得到这样的警告信息:java.lang.ClassNotFoundException error ,这就意味着你的 phptest.class 文件不在你的 java.class.path 目录下。

注意的是 JAVA 是一种强制类型语言,而 PHP 不是,这样我们在将它们融合时,容易导致错误,于是我们在向JAVA传递变量时,要正确指定好变量的类型。如:$myj->foo = (string) 12345678; or $myj->foo = "12345678″;

这只是一个很小的例子,你可以创建你自己的 JAVA 类,并使用 PHP 很好的调用它!关键在于理解java.class.path目录的重要性。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
php提交表单发送邮件的方法
Mar 20 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
PHP HTTP 认证实例详解
Nov 03 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 PHP
浅析PHP7的多进程及实例源码
Apr 14 PHP
PHP 99乘法表的几种实现代码
Oct 13 PHP
Linux php 中文乱码的快速解决方法
May 13 #PHP
PHP 返回13位时间戳的实现代码
May 13 #PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 #PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 #PHP
php用户登录之cookie信息安全分析
May 13 #PHP
PHP数组函数知识汇总
May 12 #PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 #PHP
You might like
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
杏林同学录(五)
2006/10/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
微信小程序登录session的使用
2019/03/17 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
Vue实现简易计算器
2020/02/25 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
Python中的自定义函数学习笔记
2014/09/23 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
文秘专业大学生求职信
2013/11/10 职场文书
党员一帮一活动总结
2014/07/08 职场文书
119消防日活动总结
2014/08/29 职场文书