簡介:這是PHP中介軟體--ICE的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。
class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=337545' scrolling='no'>
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 - $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 = 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.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
愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具
http://biancheng.dnbcw.info/php/337545.html pageNo:9