PHP中介軟體ICE,ICE的安裝配置,ICE常見編譯和執行(異常)錯誤

佚名發表於2018-11-25

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就是現在非常流行的網站開發中介軟體之一。

2 ICE通訊結構

ICE有分為提供服務的一方Server和尋求服務的一方Client,兩臺機子上都需要安裝ICE元件,他們的通訊結構如下:

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.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

linux環境下安裝PHP中介軟體ICE

ICE的安裝方式有多種,這裡以透過RPM的方式進行安裝為例:

1、下載ICE安裝包:

wget http://www.zeroc.com/download/Ice/3.4/Ice-3.4.1-rhel5-i386-rpm.tar.gz

ICE各版本對系統有要求,下載之前需要確認一下自己伺服器的環境是否支援,我們這裡下載的是3.4.1版本。

2、解壓

tar -zxvf Ice-3.4.1-rhel5-i386-rpm.tar.gz

解壓後我們可以看到所有的rpm安裝包:

-rw-r--r-- 1  503 users  1312303 2010-06-04 db48-4.8.30-1ice.rhel5.i386.rpm
-rw-r--r-- 1  503 users    51901 2010-06-04 db48-devel-4.8.30-1ice.rhel5.i386.rpm
-rw-r--r-- 1  503 users  1157525 2010-06-04 db48-java-4.8.30-1ice.rhel5.i386.rpm
-rw-r--r-- 1  503 users   111963 2010-06-04 db48-utils-4.8.30-1ice.rhel5.i386.rpm
-rw-r--r-- 1  503 users   112755 2010-06-04 ice-3.4.1-1.rhel5.noarch.rpm
-rw-r--r-- 1 root root  18987481 2011-04-24 Ice-3.4.1-rhel5-i386-rpm.tar.gz
-rw-r--r-- 1  503 users   540689 2010-06-04 ice-c++-devel-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users  2817314 2010-06-04 ice-java-3.4.1-1.rhel5.noarch.rpm
-rw-r--r-- 1  503 users   287932 2010-06-04 ice-java-devel-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users  3252074 2010-06-04 ice-libs-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users   195082 2010-06-04 ice-php-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users    66550 2010-06-04 ice-php-devel-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users  1036142 2010-06-04 ice-python-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users    31417 2010-06-04 ice-python-devel-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users   223937 2010-06-04 ice-ruby-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users    25127 2010-06-04 ice-ruby-devel-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users  3241350 2010-06-04 ice-servers-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users   170534 2010-06-04 ice-sqldb-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users  4500205 2010-06-04 ice-utils-3.4.1-1.rhel5.i386.rpm
-rw-r--r-- 1  503 users    90809 2010-06-04 mcpp-devel-2.7.2-2ice.rhel5.i386.rpm

3、安裝

rpm -ivh ice-3.4.1-1.rhel5.noarch.rpm
rpm -ivh db48-*.rpm 
rpm -ivh mcpp-devel-2.7.2-2ice.rhel5.i386.rpm
rpm -ivh ice-libs-3.4.1-1.rhel5.i386.rpm
rpm -ivh ice-c++-devel-3.4.1-1.rhel5.i386.rpm
rpm -ivh ice-java-*.rpm
rpm -ivh ice-php-*.rpm
rpm -ivh ice-utils-3.4.1-1.rhel5.i386.rpm
rpm -ivh ice-servers-3.4.1-1.rhel5.i386.rpm
rpm -ivh ice-sqldb-3.4.1-1.rhel5.i386.rpm

這裡我們可以根據自己的程式語言選擇相應的安裝包,上面我們安裝了:c++、java、php

需要提醒的是,我們是透過rpm -ivh的方式進行安裝,安裝過程中注意包之間的依賴關係,按順序安裝。預設會安裝到/usr/ 目錄下,執行檔案在/usr/bin目錄下 include lib分別在/usr/include 和 /usr/lib 這裡不用我多說…… 執行下 slice2cpp 提示no input file 就證明ICE環境已經可以工作啦。

另外,我們可以透過下面的兩個命令檢視安裝的ICE版本

icegridnode --version
icegridadmin --version

php中透過直接編譯的方式去安裝ICE

上面我們講過了在linux環境下透過rpm的方式來安裝ICE,這種安裝方式可以是比較簡單的,自己在安裝過程中發現後面PHP無法裝在IcePHP.sp模組,也有可能自己在安裝過程中某個地方出錯了。又嘗試透過直接編譯的方式去安裝ICE,PHP也正常裝在了IcePHP.so模組,大功告成,這裡記錄一下方法。

以安裝ICE-3.4.2版本為例,為了方便管理,將ICE相關的軟體都安裝到/usr/local/ICE-3.4.2/目錄下。

一、安裝第三方包:ThirdParty-Sources-3.4.2

1、解壓安裝包

# tar zxvf ThirdParty-Sources-3.4.2.tar.gz
# cd ThirdParty-Sources-3.4.2

2、安裝mcpp

# tar zxvf mcpp-2.7.2.tar.gz
# cd mcpp-2.7.2
# ./configure --prefix=/usr/local/ICE-3.4.2/mcpp-2.7.2/ CFLAGS=-fPIC -enable-mcpplib -disable-shared
# make
# make install

3、安裝Berkeley DB

Berkeley DB 是一個高效能的,嵌入資料庫程式設計庫,和C語言, C++, Java, Perl, Python, Tcl以及其他很多語言都有繫結。

# cd ..
# tar zxvf db-4.8.30.NC.tar.gz
# cd db-4.8.30.NC/build_unix/
# ../dist/configure --prefix=/usr/local/ICE-3.4.2/BerkeleyDB.4.6/ -enable-cxx
# make
# make install

4、安裝bzip2

bzip2 是 Julian Seward 開發並按照自由軟體/開源軟體協議釋出的資料壓縮演算法及程式。

# cd../../
# tar zxvf bzip2-1.0.6.tar.gz
# cd bzip2-1.0.6

修改Makefile,將PREFIX指向/usr/local/ICE-3.4.2/bzip2-1.0.6

# make
# make install

5、安裝expat

expat 是一個 XML parsing C library。

# cd ..
# tar zxvf expat-2.0.1.tar.gz
# cd expat-2.0.1
# ./configure --prefix=/usr/local/ICE-3.4.2/expat-2.0.1/
# make
# make install

6、安裝openssl

openssl 是 Secure Socket Layer (SSL) binary and related cryptographic tools。

# cd ..
# tar zxvf openssl-0.9.8r.tar.gz
# cd openssl-0.9.8r
# ./config --prefix=/usr/local/ICE-3.4.2/openssl
# make
# make install

二、安裝ICE-3.4.2

# tar zxvf Ice-3.4.2.tar.gz
# cd Ice-3.4.2/cpp
# vi config/Make.rules

修改安裝包路徑:

prefix ?= /usr/local/ICE-3.4.2/Ice-$(VERSION)

embedded_runpath_prefix ?= /usr/local/ICE-3.4.2/Ice-$(VERSION_MAJOR).$(VERSION_MINOR)

BZIP2_HOME ?= /usr/local/ICE-3.4.2/bzip2-1.0.6

DB_HOME ?= /usr/local/ICE-3.4.2/BerkeleyDB.4.6

EXPAT_HOME ?= /usr/local/ICE-3.4.2/expat-2.0.1

OPENSSL_HOME ?= /usr/local/ICE-3.4.2/openssl

MCPP_HOME ?= /usr/local/ICE-3.4.2/mcpp-2.7.2
# make

編譯過程報錯:

../../lib/libIce.so: undefined reference to `libiconv'
../../lib/libIce.so: undefined reference to `libiconv_close'
../../lib/libIce.so: undefined reference to `libiconv_open'
collect2: ld 返回 1
make[2]: *** [../../bin/transformdb] 錯誤 1
make[2]: Leaving directory `/data/software/Ice-3.4.2/cpp/src/FreezeScript'

make[1]: *** [all] 錯誤 1
make[1]: Leaving directory `/data/software/Ice-3.4.2/cpp/src'
make: *** [all] 錯誤 1
# make install

安裝過程報錯:

../../lib/libIce.so: undefined reference to `libiconv'
../../lib/libIce.so: undefined reference to `libiconv_close'
../../lib/libIce.so: undefined reference to `libiconv_open'
collect2: ld 返回 1
make[2]: *** [../../bin/transformdb] 錯誤 1
make[2]: Leaving directory `/data/software/Ice-3.4.2/cpp/src/FreezeScript'
make[1]: *** [install] 錯誤 1
make[1]: Leaving directory `/data/software/Ice-3.4.2/cpp/src'
make: *** [install] 錯誤 1

修改

vim config/Make.rules.Linux

找到143行這裡

BASELIBS = -lIceUtil -lpthread -lrt -liconv

 

在最後面增加-liconv, 執行make和make instll命令等待編譯完成.

至此,安裝ICE完畢。

3、編譯PHP版本

# cd ..
# cd php/
# vim config/Make.rules.php

指定安裝包路徑:

prefix ?= /usr/local/ICE-3.4.2/Ice-$(VERSION)

embedded_runpath_prefix ?= /usr/local/ICE-3.4.2/Ice-$(VERSION_MAJOR).$(VERSION_MINOR)

#指定PHP安裝路徑
PHP_HOME ?= /usr/local/php

安裝編譯

# make
# make install

4、設定ICE環境變數

# vi /etc/profile
export PHPPATH=/usr/local/ICE-3.4.2/Ice-3.4.2/php/:
export ICE_HOME=/usr/local/ICE-3.4.2/Ice-3.4.2
export PATH=$PATH:$ICE_HOME/bin
export LD_LIBRARY_PATH=$ICE_HOME/lib
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC ICE_HOME

使之生效

source /etc/profile

測試是否成功:

icegridnode --version
icegridadmin --version

Linux環境下make編譯安裝ICE-3.3.0

Linux環境下make編譯安裝ICE-3.3.0

環境:

Linux+lnmp

PHP5.2.17

1、下載安裝包:

#wget http://www.zeroc.com/download/Ice/3.3/Ice-3.3.1.zip

#wget http://www.zeroc.com/download/Ice/3.3/ThirdParty-Sources-3.3.1.tar.gz

這裡提醒一下,安裝PHP ICE需要注意PHP版本和ICE版本,PHP 5.2只能用 ICE-3.3.X版本。

2、安裝步驟

1)、解壓安裝包

#tar zxvf ThirdParty-Sources-3.3.1.tar.gz

2)、安裝mcpp

#tar zxvf mcpp-2.7.2.tar.gz

#cd mcpp-2.7.2

#./configure --prefix=/usr/local/ICE-3.3.0/mcpp-2.7.2/ CFLAGS=-fPIC -enable-mcpplib -disable-shared

#make

#make install

3)、安裝Berkeley DB

# tar zxvf db-4.6.21.NC.tar.gz

# cd db-4.6.21.NC

# cd build_unix/

# ../dist/configure --prefix=/usr/local/ICE-3.3.0/BerkeleyDB.4.6/ -enable-cxx

# make

# make install

4)、安裝bzip2

# tar zxvf bzip2-1.0.5.tar.gz

# cd bzip2-1.0.5

修改Makefile檔案:

# vim Makefile
#修改PREFIX指向
# Where you want it installed when you do 'make install'
# PREFIX=/usr/local
PREFIX=/usr/local/ICE-3.3.0/bzip2-1.0.5
# make

# make install

5)、安裝expat

# tar zxvf expat-2.0.1.tar.gz

# cd expat-2.0.1

# ./configure --prefix=/usr/local/ICE-3.3.0/expat-2.0.1/

# make

# make install

6)、安裝openssl

# tar zxvf openssl-0.9.8g.tar.gz

# cd openssl-0.9.8g

# ./config --prefix=/usr/local/ICE-3.3.0/openssl

# make

# make install

7)、安裝ICE-3.3.1

# tar zxvf Ice-3.3.1.zip

# cd Ice-3.3.1/cpp/

# vim config/Make.rules

修改:

#
# Select an installation base directory. The directory will be created
# if it does not exist.
#
prefix                   ?= /usr/local/ICE-3.3.0/Ice-$(VERSION)

#
# The "root directory" for runpath embedded in executables. Can be unset
# to avoid adding a runpath to Ice executables.
#
embedded_runpath_prefix  ?= /usr/local/ICE-3.3.0/Ice-$(VERSION_MAJOR).$(VERSION_MINOR)

# If libbzip2 is not installed in a standard location where the
# compiler can find it, set BZIP2_HOME to the bzip2 installation
# directory.
#
BZIP2_HOME              ?= /usr/local/ICE-3.3.0/bzip2-1.0.5

# If Berkeley DB is not installed in a standard location where the
# compiler can find it, set DB_HOME to the Berkeley DB installation
# directory.
#
DB_HOME         ?= /usr/local/ICE-3.3.0/BerkeleyDB.4.6

# If expat is not installed in a standard location where the compiler
# can find it, set EXPAT_HOME to the expat installation directory.
#
EXPAT_HOME              ?= /usr/local/ICE-3.3.0/expat-2.0.1

#
# If OpenSSL is not installed in a standard location where the
# compiler can find it, set OPENSSL_HOME to the OpenSSL installation
# directory.
#
OPENSSL_HOME            ?= /usr/local/ICE-3.3.0/openssl

#
# If Mcpp is not installed in a standard location where the  compiler 
# can find it, set MCPP_HOME to the Mcpp installation directory.
#
MCPP_HOME               ?= /usr/local/ICE-3.3.0/mcpp-2.7.2

修改:(如果直接make可以成功,則忽略該修改)

# vim config/Make.rules.Linux

#修改BASELIBS值,在末尾新增-liconv 
BASELIBS                = -lIceUtil -L$(NPTL_LIB) -lpthread -lrt -liconv

編譯安裝:

# make

# make install

8)、編譯安裝 PHP 版本

# cd ../php

# vim config/Make.rules

參照ICE修改相應配置,並修改PHP_HOME路徑:

# Select an installation base directory. The directory will be created
# if it does not exist.
#

prefix                  ?= /usr/local/ICE-3.3.0/Ice-$(VERSION)

#
# The "root directory" for runpath embedded in executables. Can be unset
# to avoid adding a runpath to Ice executables.
#
embedded_runpath_prefix  ?= /usr/local/ICE-3.3.0/Ice-$(VERSION_MAJOR).$(VERSION_MINOR)


# If you've installed a distribution, or PHP was included with
# your system, then you likely need to review the values of
# PHP_INCLUDE_DIR and PHP_LIB_DIR.
#

PHP_HOME                ?= /usr/local/php

編譯安裝:

# make

# make install

複製 IcePHP.so到PHP extension_dir目錄:

# cp -p /usr/local/ICE-3.3.0/Ice-3.3.1/lib/IcePHP.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

修改PHP配置檔案php.ini,新增IcePHP.so

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension = "memcache.so"
extension = "pdo_MySQL.so"
extension = "IcePHP.so"

9)、重啟服務,檢視php -m或phpinfo

# /usr/local/php/bin/php -m


filter
ftp
gd
gettext
hash
ice
iconv
json
libxml

phpinfo-ice

ICE提供 YUM 安裝,這種安裝方式最簡單,但是安裝成功後,ICE預設把PHP擴充套件安裝到了系統預設自帶的PHP中,一般情況下我們都不會自己使用linux系統自動的PHP版本,而是自己重新安裝的,ICE透過YUM安裝的方式無法對PHP進行安裝擴充套件,這個問題有待解決。

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中寫一個服務來提供統一管理和使用。

再貼個PHP使用ICE的簡單程式碼示例:

<?php
header('Content-Type:text/html;charset=utf-8');
require('Ice.php');
require('PPUserService.php');

try{
	$initData = new Ice_InitializationData;

	$initData->properties = Ice_createProperties();
	$initData->properties->load('/home/wwwroot/ice.test.com/props.cfg');
	
	$communicator = Ice_initialize($initData);
	$proxy = $communicator->stringToProxy('PP/PPUserService');
	
	$printer = com_cb_ppuserservice_serviceice_PPUserServiceIcePrxHelper::checkedCast($proxy);
	
	if(!$printer)
	{
		throw new RuntimeException("Invalid proxy");		 
	}
	
	$result = $printer->isProfileCompleted(8723504);
	var_dump($result);
}
catch(Exception $ex) 
{ 
	echo $ex; 
}

上面就是自己在除錯ICE時使用的PHP程式碼,不過在呼叫介面過程中會出現一些問題:

如果介面返回bool型別值,介面呼叫正常;

如果介面返回物件型別值,介面報錯,報"UnmarshalOutOfBoundsException"異常,正在查詢這個問題是什麼原因造成的。

過幾天再對ICE這個進行總結一下...

搭建ICE服務端和客戶端的測試環境。

1、建立ice檔案Printer.ice

module Demo{
	interface Printer{
	void printString(string s);
	};
};

2、執行 slice2cpp Printer.ice 執行成功後可以看到當前目錄下生成了 Printer.cpp 和 Printer.h 兩個檔案

3、新建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; 
}

4、編譯Server.cpp,執行:

g++ -I. -I/usr/include  -o server Printer.cpp Server.cpp  -L/usr/lib -lIce -lIceUtil

成功後會在同一目錄中生成server可執行檔案。

5、建立PHP客戶端,執行命令:

slice2php Printer.ice

 

成功後,會在同一目錄中生成Printer.php檔案

6、建立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; 
} 
} 
?>

7、開啟一終端執行:./server

8、開啟另一終端執行:php Client.php

執行成功後,我們發現每執行一次php Client.php都會在服務終端輸出 Hello World!

在php中使用ice教程

前面我們已經在linux環境下成功安裝了支援PHP的ICE環境,接下來就是怎麼在PHP使用ICE了。

1、修改PHP配置檔案php.ini,載入ICE擴充套件

vim /usr/local/php/etc/php.ini

新增:

extension = "IcePHP.so"

重啟服務

/etc/init.d/php-fpm reload

檢視ICE是否載入成功:

1)透過命令檢視已安裝PHP擴充套件

[root@localhost ~]# php -m

顯示:

gettext
gmp
hash
ice
iconv
libxml

可以看到有ICE的身影了,說明已經成功了。

另外也可以透過phpinfo的方式檢視:

PHP ice擴充套件

接下來就是在應用中載入Ice了,這裡我們可以檢視官方是怎麼介紹的:

Your application will also need to include at least some of the Ice for PHP run-time source files (installed in /usr/share/php on RHEL, Amazon Linux, and Ubuntu, and in /usr/share/php5 on SLES). This installation directory is included in PHP's default include path, which you can verify by executing the following command:

% php -i | grep include_path

If the installation directory is listed, no further action is necessary to make the run-time source files available to your application. Otherwise, you can modify the include_path setting in php.ini to add the installation directory:

include_path = /usr/share/php:...

Another option is to modify the include path from within your script prior to including any Ice run-time file:

PHP
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '/usr/share/php');
require 'Ice.php'; // Load the core Ice run time definitions.

ICE常見編譯和執行(異常)錯誤

在編譯和 Ice 應用相關的檔案中,經常因為 ice 相關的檔案包含關係而導致編譯無法透過,此時的錯誤一般提示和 handle.h 相關。然而想要解決這樣的錯誤,一般只需要把在無法編譯成 .o 檔案的 .cpp 檔案中和 ice 檔案相關的標頭檔案放在該 .cpp 檔案的起始行即可。也就是說,根據提示,把 .cpp 檔案中最早提示導致出錯的 .h 檔案放在起始行。

ICE 的常見執行錯誤 ( 異常 ):

1 使用的地址錯誤 ,IP 並非本地 IP: 發生在初始化伺服器時 , 沒辦法初始化 adapter.

錯誤資訊 : (IP 錯誤 )

 

./test: Network.cpp:475: Ice::SocketException:

socket exception: Cannot assign requested address

另外 : 已經啟動伺服器後又重新啟動 : 發生在初始化伺服器時 , 沒辦法初始化 adapter.

錯誤資訊 : (port 已經被使用 )

 

./server: Network.cpp:475: Ice::SocketException:

socket exception: Address already in use

///stringtoProxy 對於任何 string 都是有效的 , 均可以生成相應代理 , 但是該代理是否有效是無法保證的 . 如果代理無效 , 也就是說根本就沒有這樣的 adapter 或者物件 , 那麼使用 Checkcast 或直接用該代理呼叫相應物件介面均會拋異常 . 下面對每種情況加於分析 .

2 使用的代理 IP 錯誤 : 發生在使用代理呼叫介面的時候

原因 : 根本就沒有相應的通訊器存在 .

錯誤資訊 : ( 使用的代理 IP 錯誤 )

丟擲異常 : Ice::ConnectFailedException ( 需要幾秒 , 需要進行搜尋 )

3 使用的代理埠錯誤 , 兩邊不一致 : 發生在使用代理呼叫介面的時候

原因 : 存在通訊器 , 但是不存在相應的物件介面卡 .

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 , 埠沒有被啟用引起的 , 無人監聽該埠 )

4 使用的物件名字不正確 : 發生在使用代理呼叫介面的時候

原因 : 能夠找到相應的物件介面卡 , 但是該物件介面卡中無法找到相應的物件

錯誤資訊 :

丟擲異常 : Ice::ObjectNotExistException ( 很快 )

5 對方程式沒用啟用 , 也就是伺服器沒有啟用 : 發生在使用代理呼叫介面的時候

原因 : 根本就沒有相應的通訊器存在 .

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

6 連線突然斷開 ( 比如對方因為段錯誤而程式停止 , 或者在連線過程中正常關閉 ) : 發生在使用代理呼叫介面的時候 ( 連線丟失 )

原因 : 已經建立連線的對方突然斷開

錯誤資訊 :

 

warning: connection exception:

TcpTransceiver.cpp:217: Ice::ConnectionLostException:

connection lost: recv() returned zero

local address = 10.0.0.4:10050

remote address = 10.0.0.200:33412

( 伺服器端的錯誤 , 使用 createObjectAdapter() 建立物件介面卡 )

7 伺服器端沒有指定 adapter 的埠和 ip, 僅僅隨便給了一個名字 , 並使用該名字從配置檔案中讀取資訊 : 啟動伺服器時沒有問題正常 , 但是客戶端無法連線

原因 : 物件介面卡無效來源 幫客之家www。bkjia.com

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

8 啟動伺服器時 , 給定的 adapter 的名字和配置檔案中使用的不一致 : 啟動伺服器時沒有問題正常 , 但是客戶端無法連線 ( 無法從配置檔案中獲取所需要的資訊 port 和 ip)

原因 : 物件介面卡無效

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

9 配置檔案中的名字和程式中給定的 adapter 名字一致 , 也就是說缺少 Endpoints, 作為字尾 . 啟動伺服器時沒有問題正常 , 但是客戶端無法連線 ( 無法從配置檔案中獲取所需要的資訊 port 和 ip)

原因 : 物件介面卡無效

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

10 配置檔案中的名字字尾 Endpoints 寫錯 , 比如 Endpoint. 啟動伺服器時沒有問題正常 , 但是客戶端無法連線 ( 無法從配置檔案中獲取所需要的資訊 port 和 ip)

原因 : 物件介面卡無效

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

11 程式中給定的 adapter 名字多了字尾 Endpoints( 或者其他字元 , 甚至是 ”.”). 啟動伺服器時沒有問題正常 , 但是客戶端無法連線 ( 無法從配置檔案中獲取所需要的資訊 port 和 ip)

原因 : 物件介面卡無效

錯誤資訊 :

丟擲異常 : Ice::ConnectionRefusedException ( 很快 )

( 說明 : 也就是說配置檔案中必須有 Endpoints 作為字尾 , 而在程式中給定 adapter 的名字是一定不能帶該字尾 , 不然伺服器無法正常工作 )

相關文章