设为首页 收藏本站
查看: 1708|回复: 0

[经验分享] PHP中间件--ICE

[复制链接]

尚未签到

发表于 2015-8-23 09:07:54 | 显示全部楼层 |阅读模式
  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.iyunv.com/phphot/archive/2009/04/18/4089806.aspx
  http://hi.baidu.com/xdh2571/blog/item/8f01fafc4debfc89b801a04b.html
  
  2 对于ICE,它是怎么样通信结构?
  ICE有分为提供服务的一方Server和寻求服务的一方Client,两台机子上都需要安装ICE组件,他们的通信结构如下:
DSC0000.png
  
  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 - $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 &#8211;lIceUtil   //在同文件夹下会出现:server执行文件
  
  F #slice2php Printer.ice
  G 创建Client.php

  <?php
require 'Ice.php';
require 'Printer.php';
  $ic = null;
try
{
$ic = Ice_initialize();
$base = $ic->stringToProxy("SimplePrinter:default -p 10000");
$printer = Demo_PrinterPrxHelper::checkedCast($base);
if(!$printer)
throw new RuntimeException("Invalid proxy");
  $printer->printString("Hello World!");
}
catch(Exception $ex)
{
echo $ex;
}
  if($ic)
{
// Clean up
try
{
$ic->destroy();
}
catch(Exception $ex)
{
echo $ex;
}
}
?>

  H
  打开一个终端运行 #./server
  打开另一个终端运行 php Client.php
  
  发现每运行一次Client.php,第一个终端就打出一个Hello World. ICE 运行成功.
  
  
  附注:大型的网站对于ICE的使用是很多的。比如需要实现一个分词搜索的功能使用lucence,对数据库的访问,对memcached的访问都可以直接在ICE中写一个服务来提供统一管理和使用
  
  
  作者:轩脉刃(yjf512)
出处:(http://www.iyunv.com/yjf512/)
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。
  
  [参考文章]
  http://blog.iyunv.com/phphot/archive/2009/04/18/4089806.aspx
  http://hi.baidu.com/xdh2571/blog/item/8f01fafc4debfc89b801a04b.html
  http://www.zeroc.com/
  (特别是里面的Document)
  http://blog.iyunv.com/cnhome/archive/2008/11/18/3331279.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102838-1-1.html 上篇帖子: PHP中spl_autoload_register函数的用法 下篇帖子: PHP之数组学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表