54 CHEN

“先进的互联互通技术”--使用ice联通php和java [Part 1 Server]

PHP没有中间件,导致了对很多麻烦。比如,对数据库的作必须要链接数据库,然后做SQL作。WEB程序直接作数据库的方法,这样会带来很多人为因素的事故隐患,以及管理上的麻烦,尤其是对大型的网站应用来说。规范的模式应该是,WEB程序传递参数到一个服务程序上,由该服务程序进行判断并最终作数据库或者其它数据文件,这样做到了明确权限控制,和业务类型集中管理。去年伴随着ICE的推出,PHP终于有了可以使用的中间件。在PHP的发展史上,应该是一个里程碑。

ICE入门

ICE(Internet Communications Engine 网络通讯引擎),是由Corba原核心成员开发的一个开源中间件,据称其各种性能完全优于Corba。除此之外,我们第一次见到了直接支持PHP的中间件。

ICE的安装,去http://www.zeroc.com/download.html 下载一个Ice针对PHP的安装包,按照说明安装上。

ICE的使用:使用Slice(ICE的一种简单语法脚本),编写一个xx.ice文件。可以使用slice2cpp或slice2java等生成一个cpp或java的ICE框架程序,然后在这个框架程序中进行代码编写。ICE在PHP的应用继承了PHP的一贯传统——简单,只需要在php.ini中加载该xx.ice,在PHP中就可以使用了。

ICE在PHP应用中的缺点,无法使用PHP编写Server端,其实这也是PHP的一个缺陷——没有完善的多进程和多线程管理机制。因此,Server端可以采用ICE所支持的其它语言进行编写,比如JAVA/C++/VB/PYTHON等。

开始传说中的“互联互通”

本例以 Ice 3.2.1为例 下载的位置和参考的文档都在下面

http://www.zeroc.com/download_3_2_1.html

http://www.zeroc.com/doc/Ice-3.2.1/manual/Slice.5.10.html#50592 ICE其实是一个网络框架,入门说明中说了,PHP不能用来做服务端,在这里我们使用java来做服务端,用php来连java,达到传说中的“互联互通”。

我们的服务端用Linux,客户端也用Linux(纯废话)。JAVA环境的搭建不在表述了。

在下载可以看出来,服务器支持yum或者是rpm是多么幸福的一件事情,或者搞一份tar.gz的包下来configure make make install,大概也就是这样。好了这样子就表示安装结束了。。。

安装之后的Ice相关路径:

slice2cpp,slice2java在/usr/bin/下

Ice.jar 存储于 /usr/share/java/下

相关的Ice的库存储于/usr/lib下. 第1步,建立服务器端的demo.ice的文件(注意代码里的半全角,如果是全角自行转成半角):

module Demo{

interface test{

string   execute(string mth,string cmd);

};

}; 第2步,执行: slice2java demo.ice 生成一堆文件。。。

第3步,动手干活

上一步执行完会在当前目录产生一个Demo目录,目录下自动生成:
-rw-r–r–  1 root root 2316  4月 15 17:01 _testDelD.java
-rw-r–r–  1 root root  560  4月 15 17:01 _testDel.java
-rw-r–r–  1 root root 1929  4月 15 17:01 _testDelM.java
-rw-r–r–  1 root root 4177  4月 15 17:01 _testDisp.java
-rw-r–r–  1 root root 1070  4月 15 17:01 testHolder.java
-rw-r–r–  1 root root  488  4月 15 17:01 test.java
-rw-r–r–  1 root root  481  4月 15 17:01 _testOperations.java
-rw-r–r–  1 root root  460  4月 15 17:01 _testOperationsNC.java
-rw-r–r–  1 root root 5418  4月 15 17:01 testPrxHelper.java
-rw-r–r–  1 root root  569  4月 15 17:01 testPrxHolder.java
-rw-r–r–  1 root root  567  4月 15 17:01 testPrx.java
到目前为止,demo.ice所以Ice接口部分的定义以及相关依赖都已经自动生成.

我们要实现自己的execute方法,覆盖testPrx.java的同名方法:

//TestImp.java

package Demo;

import Ice.Current;

public class TestImp extends _testDisp{

public String execute(String mth, String cmd, Current __current) {

// TODO Auto-generated method stub

return mth+cmd;

}

} 第4步,建立一个Server服务在10000端口进行侦听

//Server.java

package Demo;

public class Server {

public static void main(String[] args) {

int status = 0;

Ice.Communicator ic = null;

try {

ic = Ice.Util.initialize(args);

Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(

“TestAdapter”, “default -p 10000”);

Ice.Object object = new TestImp();

adapter.add(object, ic.stringToIdentity(“TestAdapter”));

adapter.activate();

ic.waitForShutdown();

} catch (Ice.LocalException e) {

e.printStackTrace();

status = 1;

} catch (Exception e) {

System.err.println(e.getMessage());

status = 1;

}

if (ic != null) {

// Clean up

//

try {

ic.destroy();

} catch (Exception e) {

System.err.println(e.getMessage());

status = 1;

}

}

System.exit(status);

}

} 以上大部分代码都是框架生成,你只需要在里面填写TODO。把这个代码拖回来用eclipse打成jar包,注意,需要依赖ice.jar这个包,这个包可以在官方网站下载到。http://www.zeroc.com/download_3_2_1.html

生成DemoServer.ajr后传到服务器,运行java -cp ./:Ice.jar:DemoServer.jar Demo.Server

运行成功的条件是Ice.jar和DemoServer.jar都在一个目录里。(Ice.jar从下载地址下载)

Server运行之后监听于10000端口,需要修改iptables,允许其他机器可以连接。
编辑 iptables
vi /etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 10000 -j ACCEPT

继续深入互联互通

这一节完成了Server,一个10000端口的Server在等待着我们用PHP来联通中。下一节,我们将讲述:IcePHP环境的搭建,PHP调用Ice如何与JAVA互联互通,以及一个完整的Demo,保存好本节的代码,后面还有用处。[未完待续]

原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]

Posted by 54chen java, php, 架构研究