PHP中间件--ICE
ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中間件。使用ICE能使得php(或c++,java,python)與java,c++,.net,python等進(jìn)行交互。基于ICE可以實現(xiàn)電信級的解決方案。
?
1第一個問題:為什么要使用中間件?
設(shè)想一個這樣的場景:對于一個大型網(wǎng)站來說,往往有很多個web服務(wù)器,每個web服務(wù)器都存在很多對于數(shù)據(jù)庫的操作。如果直接在php程序上直接操作數(shù)據(jù)庫,那么勢必要在每臺web服務(wù)器都配置數(shù)據(jù)庫的用戶名,密碼等信息,這是極度不安全的。并且如果我們要統(tǒng)一對數(shù)據(jù)庫的操作進(jìn)行管理和修改等,那么久要去每個web服務(wù)器上修改。因此,這時候中間件就產(chǎn)生了。它是基于SOA(面向服務(wù)架構(gòu))的思想,將對數(shù)據(jù)庫的操作統(tǒng)一成一個服務(wù),放置于一臺服務(wù)機上,每個web服務(wù)器要對數(shù)據(jù)庫進(jìn)行操作,就可以直接訪問這個提供中間件服務(wù)的服務(wù)器。
還有一點,考慮到性能問題,這里的提供服務(wù)的機子我們不使用html和xml傳輸數(shù)據(jù),一般使用TCP,UDP這層的通信。
因此ICE就是現(xiàn)在非常流行的網(wǎng)站開發(fā)中間件之一。
?
關(guān)于更多理解為何使用中間件的原因這里有兩個鏈接:
http://blog.csdn.net/phphot/archive/2009/04/18/4089806.aspx
http://hi.baidu.com/xdh2571/blog/item/8f01fafc4debfc89b801a04b.html
?
2 對于ICE,它是怎么樣通信結(jié)構(gòu)?
ICE有分為提供服務(wù)的一方Server和尋求服務(wù)的一方Client,兩臺機子上都需要安裝ICE組件,他們的通信結(jié)構(gòu)如下:
?
Client端應(yīng)該事先知道Server端能提供的服務(wù)是什么,有什么格式?這就是圖中的Proxy Code,在Proxy Code中定義好了類和接口。Server端中接口定義的就是Skeleton,具體實現(xiàn)接口的是Server Application,Server Application可以是C++,java,C#等寫的,但是ICE不提供PHP寫Server端。
?
3 安裝ICE
安裝環(huán)境: CentOS
1) cd /etc/yum.repos.d/ wget http://www.zeroc.com/download/Ice/3.4/rhel5/zeroc-ice.repo2)
編輯zeroc-ice.repo:
[zeroc-ice]
name=Ice 3.4 for Red Hat Enterprise Linux ?
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)
確認(rèn)機子是否安裝g++,如果沒有,則安裝:
yum install gcc-c++ libstdc++-devel
?
4 寫一個ICE例子,目的:Client端每調(diào)用一次服務(wù),Server端就打出一個"hello world”;
?
基本環(huán)境:由于是實驗?zāi)康?#xff0c;我僅僅將Client和Server同當(dāng)做一臺CentOS機子
?
A 建文件夾: mkdir ice_demo
?
B 創(chuàng)建文件Printer.ice,這個.ice文件是ICE的slice文件,在其中定義了服務(wù)的對象和接口
module Demo {
interface Printer {
void printString(string s);
};
};
?
C #slice2cpp Printer.ice //產(chǎn)生出了Printer.h和Printer.cpp兩個文件
D 創(chuàng)建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?? //在同文件夾下會出現(xiàn):server執(zhí)行文件
?
F #slice2php Printer.ice
G 創(chuàng)建Client.php
<?php
require 'Ice.php';
require 'Printer.php';
ic?=?null;
?????try
?????{
?ic->stringToProxy("SimplePrinter:default -p 10000");
???
base);
if(!$printer)
throw new RuntimeException("Invalid proxy");
printer->printString("Hello?World!");
?????}
?????catch(Exception
ex)
{
echo $ex;
}
if(ic)
?????{
?????//?Clean?up
?????try
?????{
}
catch(Exception ex)
?????{
?????echo
ex;
}
}
?>
H
打開一個終端運行 #./server
打開另一個終端運行 php Client.php
?
發(fā)現(xiàn)每運行一次Client.php,第一個終端就打出一個Hello World. ICE 運行成功.
?
?
附注:大型的網(wǎng)站對于ICE的使用是很多的。比如需要實現(xiàn)一個分詞搜索的功能使用lucence,對數(shù)據(jù)庫的訪問,對memcached的訪問都可以直接在ICE中寫一個服務(wù)來提供統(tǒng)一管理和使用
?
?
作者:軒脈刃(yjf512)
出處:(http://www.cnblogs.com/yjf512/)
版權(quán)聲明:本文的版權(quán)歸作者與博客園共有。歡迎轉(zhuǎn)載閱讀,轉(zhuǎn)載時須注明本文的詳細(xì)鏈接。?
?
[參考文章]
http://blog.csdn.net/phphot/archive/2009/04/18/4089806.aspx
http://hi.baidu.com/xdh2571/blog/item/8f01fafc4debfc89b801a04b.html
http://www.zeroc.com/
(特別是里面的Document)
http://blog.csdn.net/cnhome/archive/2008/11/18/3331279.aspx
來源:https://www.cnblogs.com/yjf512/archive/2011/06/07/2074554.html
總結(jié)
以上是生活随笔為你收集整理的PHP中间件--ICE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 己所不欲勿施于人下半句(ldquo 己所
- 下一篇: 矛与盾文言文翻译拼音(矛与盾文言文翻译)