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,保存好本节的代码,后面还有用处。[未完待续]