ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中间件。使用ICE能使得php(或c++,java,python)与java,c++,.net,python等进行交互。基于ICE可以实现电信级的解决方案。

1第一个问题:为什么要使用中间件?

设想一个这样的场景:对于一个大型网站来说,往往有很多个web服务器,每个web服务器都存在很多对于数据库的操作。如果直接在php程序上直接操作数据库,那么势必要在每台web服务器都配置数据库的用户名,密码等信息,这是极度不安全的。并且如果我们要统一对数据库的操作进行管理和修改等,那么久要去每个web服务器上修改。因此,这时候中间件就产生了。它是基于SOA(面向服务架构)的思想,将对数据库的操作统一成一个服务,放置于一台服务机上,每个web服务器要对数据库进行操作,就可以直接访问这个提供中间件服务的服务器。

还有一点,考虑到性能问题,这里的提供服务的机子我们不使用html和xml传输数据,一般使用TCP,UDP这层的通信。

因此ICE就是现在非常流行的网站开发中间件之一。

关于更多理解为何使用中间件的原因这里有两个链接:

http://blog.csdn.net/phphot/archive/2009/04/18/4089806.aspx

http://hi.baidu.com/xdh2571/blog/item/8f01fafc4debfc89b801a04b.html

2 对于ICE,它是怎么样通信结构?

ICE有分为提供服务的一方Server和寻求服务的一方Client,两台机子上都需要安装ICE组件,他们的通信结构如下:

Client端应该事先知道Server端能提供的服务是什么,有什么格式?这就是图中的Proxy Code,在Proxy Code中定义好了类和接口。Server端中接口定义的就是Skeleton,具体实现接口的是Server Application,Server Application可以是C++,java,C#等写的,但是ICE不提供PHP写Server端。

3 安装ICE

安装环境: CentOS

1)
cd /etc/yum.repos.d/
wget http://www.zeroc.com/download/Ice/3.4/rhel5/zeroc-ice.repo

2)

编辑zeroc-ice.repo:

[zeroc-ice]

name=Ice 3.4 for Red Hat Enterprise Linux releasever−releasever−basearch

baseurl=http://www.zeroc.com/download/Ice/3.4/rhel5/$basearch

enabled=1

gpgcheck=1

gpgkey=http://www.zeroc.com/download/RPM-GPG-KEY-zeroc-release

3)

使用yum安装

yum install ice* db46* mcpp-devel

4)

确认机子是否安装g++,如果没有,则安装:

yum install gcc-c++ libstdc++-devel

4 写一个ICE例子,目的:Client端每调用一次服务,Server端就打出一个"hello world”;

基本环境:由于是实验目的,我仅仅将Client和Server同当做一台CentOS机子

A 建文件夹: mkdir ice_demo

B 创建文件Printer.ice,这个.ice文件是ICE的slice文件,在其中定义了服务的对象和接口

module Demo { 
interface Printer { 
void printString(string s); 
}; 
};

C #slice2cpp Printer.ice //产生出了Printer.h和Printer.cpp两个文件

D 创建Server.cpp

#include <Ice/Ice.h> 
#include <Printer.h> 
  
using namespace std; 
using namespace Demo; 
  
class PrinterI : public Printer { 
public: 
virtual void printString(const string& s, 
const Ice::Current&); 
}; 
  
void  
PrinterI:: 
printString(const string& s, const Ice::Current&) 

cout << s << endl; 

  
int 
main(int argc, char* argv[]) 

int status = 0; 
Ice::CommunicatorPtr ic; 
try { 
ic = Ice::initialize(argc, argv); 
Ice::ObjectAdapterPtr adapter 
= ic->createObjectAdapterWithEndpoints( 
"SimplePrinterAdapter", "default -p 10000"); 
Ice::ObjectPtr object = new PrinterI; 
adapter->add(object, 
ic->stringToIdentity("SimplePrinter")); 
adapter->activate(); 
ic->waitForShutdown(); 
} catch (const Ice::Exception& e) { 
cerr << e << endl; 
status = 1; 
} catch (const char* msg) { 
cerr << msg << endl; 
status = 1; 

if (ic) { 
try { 
ic->destroy(); 
} catch (const Ice::Exception& e) { 
cerr << e << endl; 
status = 1; 


return status; 
}

E

#c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp

# c++ -o server Printer.o Server.o \ -L$ICE_HOME/lib -lIce –lIceUtil   //在同文件夹下会出现:server执行文件

F #slice2php Printer.ice

G 创建Client.php

<?php 
require 'Ice.php'; 
require 'Printer.php';

ic = null;
     try

{ic = null;     try     {ic = Ice_initialize(); 
base=base=ic->stringToProxy("SimplePrinter:default -p 10000"); 
printer=DemoPrinterPrxHelper::checkedCast(printer=DemoPrinterPrxHelper::checkedCast(base); 
if(!$printer) 
throw new RuntimeException("Invalid proxy");

printer->printString("Hello World!");
     }

catch(Exceptionprinter->printString("Hello World!");     }     catch(Exceptionex) 

echo $ex; 
}

if(ic)
     {

// Clean up

try

{ic)     {     // Clean up     try     {ic->destroy(); 

catch(Exception ex)

{

echoex)     {     echoex; 


?>

H

打开一个终端运行 #./server

打开另一个终端运行 php Client.php

发现每运行一次Client.php,第一个终端就打出一个Hello World. ICE 运行成功.

附注:大型的网站对于ICE的使用是很多的。比如需要实现一个分词搜索的功能使用lucence,对数据库的访问,对memcached的访问都可以直接在ICE中写一个服务来提供统一管理和使用

PHP中间件--ICE的更多相关文章

  1. 高性能分布式应用开发中间件ICE介绍

    作为一个技术人员,你是否在为不断增长的数据量和日益复杂的业务逻辑而头疼不已,杂乱堆砌在一起的庞大业务让系统越来越脆弱,于是你想到了网格,想到了利用分布式来重组一个健壮的系统架构. 随后,RMI,EJB ...

  2. ICE 的回调

    使用分布式计算中间件ICE到现在已经有一年多了,在这一年里里面对ICE的理解.应用比较熟悉. 使用ICE写分布式软件,确实是很方便:ICE比较稳定.可靠,调用返回速度低延迟,使用简单,学习曲线不是很陡 ...

  3. js的prototype(2)

    1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javasc ...

  4. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  5. ICE中间件相关

    Ice 是 网络通信引擎 Internet Communications Engine 的简称,是ZeroC开发的一个面向对象的中间件平台.它提供了面向对象的远程过程调用.网格计算和发布/订阅功能,并 ...

  6. wamp调用ICE中间件

    wamp调用ICE中间件 wamp 是集成开发包,我的wamp中的php 为5.3.10 ,经过3天艰苦奋战,终于在phpinfo()中看到了 ICE 出现了.. OK,最新的ice  为 3.5.1 ...

  7. 在windows7下配置PHP访问ICE中间件(ICE3.5.1+PHP5.4+Apache2.2 for vc9)

    按照ICE的官方文档(http://doc.zeroc.com/display/Ice/Using+the+Windows+Binary+Distribution#UsingtheWindowsBin ...

  8. ZeroC Ice启用SSL通讯的配置

    Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...

  9. ZeroC Ice 暂记

    摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...

随机推荐

  1. Python类之魔术方法

    一.什么是魔术方法? 在Python的方法,我们经常会遇见__XXX__(),这样的方法,我们一般称为"魔术方法",赶紧搬个小板凳,我们一起来看看魔术方法有啥神奇的地方,这些方法又 ...

  2. LG2945 【[USACO09MAR]沙堡Sand Castle】

    经典的贪心模型,常规思路:将M和B排序即可 看到没有人用优先队列,于是我的showtime到了 说下思路: 读入时将数加入啊a,b堆中,不用处理(二叉堆本来就有有序的性质) 读完后逐个判断,照题目模拟 ...

  3. Visual Event :快速查看 DOM 上绑定的 JS 事件

    http://web.jobbole.com/82503/ Javascript中的事件经常被认为如谜一般不可解.Javascript是一个事件驱动的语言,在这样的前提下前面的看法是很奇怪,但是说到它 ...

  4. 机器学习Hands On Lab

    fetch_data fetch_mldata默认路径是在scikit_learn_data路径下,mnist的mat文件其实直接放置到scikit_lean/mldata下面即可通过fetch_ml ...

  5. c#问题(按F1或F2键时触发事件)

    this.KeyPreview = true;...private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArg ...

  6. 解决webpack不是内部命令

    在指定路径下安装webpack npm install webpack --save-dev 但是报”不是内部命令错误" 解决方法:安装全局webpack   npm install web ...

  7. NPOI 创建Excel 设置宽度 样式 颜色对比表

    前两天用NPOI来操作Office软件,在使用的时候有点问题,也有收获,就做个笔记 记录下来,主要做的事数据的导出功能.一些公共的方法,做个笔记. 更多的详细内容可以到NPOI的官方教程去看  htt ...

  8. 【python】实例-创建文件并通过键盘输入字符

    import os lnend=os.linesep ##windows行结束符号是“\r\n” FileName=raw_input("please input filename:&quo ...

  9. python 异常类型----后期需理解调整

    1.Python内建异常体系结构The class hierarchy for built-in exceptions is: BaseException +-- SystemExit +-- Key ...

  10. spring boot学习(2) SpringBoot 项目属性配置

    第一节:项目内置属性 application.properties配置整个项目的,相当于以前的web.xml: 注意到上一节的访问HelloWorld时,项目路径也没有加:直接是http://loca ...