论坛首页 编程语言技术论坛

php和java协同开发

浏览 5042 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-08   最后修改:2010-03-27
PHP
引用
    因为在做垂直搜索工作中,使用的是java编写的一个搜索类库。做垂直搜索,很多实用要使用到配置。当搜索的信息量大时,网站的更新。搜索程序的配置维护是一个不可忽视的问题。所以用了php做网页,提供配置界面,这样就可以不用直接修改配置文件或是配置数据库表。当把配置信息配置好了,我们需要检测配置是否正确,因为使用的是java程序,所以检测配置的正确与否使用的也是java程序来检测。这里就存在一个问题,就是需要把php页面上的信息传入到java程序中去检测。这个时候就需要php和java通信了。下面我就来介绍下怎么使php跟java通信(当然,你也可以使用类似webservice等技术)也就是php中调用java程序。

       php要调用java程序:需要以下准备,php程序,java程序,还有就是shell程序或是bat程序。下面分别介绍下在linux服务器下php调用java程序和在windows服务器下调用java程序。前提是php,apache,jdk的环境都已经配置好。


 一 在linux下php调用java程序是通过shell文件。分别是以下三个文件: test_shell.php  test_shell.java  test_shell.sh 他们的源代码如下:

1.test_shell.java程序代码

public class test_shell {

	public static void main(String[] args) {
		
		System.out.println("你输入的参数是:"+args[0]+"\t"+args[1]);

	}

}

2.test_shell.php程序代码

<?php
	/*
	 * 该函数是用来执行shell命令的,其实还可以使用:exec(),system(), 	 * popen()和pclose(),passthru() 函数。最长用的是前面两个和例中使 	 * 用的shell_exec()。
	 */
	 $args1="我喜欢你";
	 $args2="我很爱你";
	
	 // 注意空格
	$r=shell_exec("./test_shell.sh $args1 $args2");

	echo $r;

?> 


3.test_shell.sh程序代码是

#!/bin/sh

JAVA_HOME=/usr/local/jdk

CLASSPATH=.:/usr/local/jdk/jre/lib/rt.jar:/usr/local/apache/htdocs/test_shell/test_shell.class

PATH=$PATH:$JAVA_HOME/bin

export JAVA_HOME CLASSPATH PATH

cd /usr/local/apache/htdocs/test_shell

java test_shell

#shell代码结束

以下是三个程序的存放路径和运行次序。
1.三个文件都必须在同一目录下,比如在/usr/local/apache/htdocs/test_shell/下,不然php很难调到java程序。

2.把test_shell.java程序编译成test_shell.class,然后把test_shell.class文件存放到CLASSPATH中。如果系统配置了那些环境变量,这里在配置一次是没有坏处的,也不会影响配置好的系统环境变量。这里设置的好处是当没有配置jdk环境配置,只有jre时,则需把jre放到/usr/local/jdk下就以。


二、下面先介绍在windows服务器下,php调用java程序是通过bat文件来的。分别是以下三个文件: test_bat.php  test_bat.java  test_bat.sh 他们的源代码如下:

1.java程序

public class test_bat {

	public static void main(String[] args) {
		
		System.out.println("你输入的参数是:"+args[0]+"\t"+args[1]);

	}

}

2.test_bat.php程序代码

<?php
	/*
	 * 该函数是用来执行shell命令的,其实还可以使用:exec(),system(), 	 * popen()和pclose(),passthru() 函数。最长用的是前面两个和例中使 	 * 用的shell_exec()。
	 */
	 $args1="我喜欢你";
	 $args2="我很爱你";
	
	 // 注意空格
	$r=shell_exec("./test_shell.sh $args1 $args2");

	echo $r;

?> 


3.test_bat.sh程序代码是

@echo off
set path=%path%;%cd%\jre\bin
set CLASSPATH=.;%cd%\jre\lib\rt.jar;%cd%\test_bat.class
java test_bat %1 %2

#bat代码结束

1.三个文件都必须放在同一目录下,比如在/usr/local/apache/htdocs/test_bat/下,不然php很难调到java程序。

2.把test_bat.java程序编译成test_bat.class,然后把test_bat.class文件存放到CLASSPATH中。如果系统配置了那些环境变量,这里在配置是没有坏处的,也不会影响配置好的系统环境变量。这里设置的好处是当没有配置jdk环境配置,只有jre时,则需把jre放到跟跟test_bat.java同一目录下就行了。


三、上面两个例子中,test_shell.sh用的绝对路径,test_bat.bat是用的相对路径。不管是绝对还是相对,只要路径对了就行了。

   发表时间:2010-04-14  
这样用吃力,怎么就不用python把它们结合起来,python号称为胶水语言
0 请登录后投票
   发表时间:2010-04-14  
那么复杂啊,用REST+JSON就行了
0 请登录后投票
   发表时间:2010-04-15  
很有些啰嗦...语言自己定义 server api 算了。何必搅在一起
0 请登录后投票
   发表时间:2010-04-15  
rest/rpc/gearman/ice這麼多方式不用。。。
0 请登录后投票
   发表时间:2010-04-15  

// 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'));
 
0 请登录后投票
   发表时间:2010-04-16  
还是soap吧,数据都用xml通信的,跨平台跨语言。
0 请登录后投票
   发表时间:2010-04-16  
还是用Hprose吧,比楼主的方式和上面说的这些方式都要简单容易的多,效率还是SOAP的100倍。
0 请登录后投票
   发表时间:2010-04-21  
fyland 写道

 

// 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'));
 

 

这个java类是什么?原来是php的一个java模块。刚才照了一下minij2ee有个sjop协议也可以完成php调java,原理是由minij2ee将java转换成php,然后php将对应的文件引入就可以使用了。

0 请登录后投票
   发表时间:2010-05-04   最后修改:2010-05-04

调用系统命令来协同使用php和java是不知死活的。

系统开销那可不是一般的大。就是用xml、json来交互或共享数据都比使用系统命令强很多

php_java 也不是什么好东西
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics