標籤:wait 組件 hive 配置 images mkdir 管理 就是 3.4
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端應該事Crowdsourced Security Testing道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