PHP中间件--ICE
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.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)
確認機子是否安裝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->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
?
發現每運行一次Client.php,第一個終端就打出一個Hello World. ICE 運行成功.
?
?
附注:大型的網站對于ICE的使用是很多的。比如需要實現一個分詞搜索的功能使用lucence,對數據庫的訪問,對memcached的訪問都可以直接在ICE中寫一個服務來提供統一管理和使用
?
?
作者:軒脈刃(yjf512)
出處:(http://www.cnblogs.com/yjf512/)
版權聲明:本文的版權歸作者與博客園共有。歡迎轉載閱讀,轉載時須注明本文的詳細鏈接。?
?
[參考文章]
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
總結
以上是生活随笔為你收集整理的PHP中间件--ICE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 己所不欲勿施于人下半句(ldquo 己所
- 下一篇: 矛与盾文言文翻译拼音(矛与盾文言文翻译)