PHP中間件ICE,ICE的安裝配置,ICE常見編譯和運(yùn)行(異常)錯(cuò)誤
ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中間件。使用ICE能使得php(或c++,java,python)與java,c++,.net,python等進(jìn)行交互?;贗CE可以實(shí)現(xiàn)電信級(jí)的...
ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中間件。使用ICE能使得php(或c++,java,python)與java,c++,.net,python等進(jìn)行交互?;贗CE可以實(shí)現(xiàn)電信級(jí)的解決方案。
1。為什么要使用中間件?
設(shè)想一個(gè)這樣的場(chǎng)景:對(duì)于一個(gè)大型網(wǎng)站來說,往往有很多個(gè)web服務(wù)器,每個(gè)web服務(wù)器都存在很多對(duì)于數(shù)據(jù)庫(kù)的操作。如果直接在php程序上直接操作數(shù)據(jù)庫(kù),那么勢(shì)必要在每臺(tái)web服務(wù)器都配置數(shù)據(jù)庫(kù)的用戶名,密碼等信息,這是極度不安全的。并且如果我們要統(tǒng)一對(duì)數(shù)據(jù)庫(kù)的操作進(jìn)行管理和修改等,那么久要去每個(gè)web服務(wù)器上修改。因此,這時(shí)候中間件就產(chǎn)生了。它是基于SOA(面向服務(wù)架構(gòu))的思想,將對(duì)數(shù)據(jù)庫(kù)的操作統(tǒng)一成一個(gè)服務(wù),放置于一臺(tái)服務(wù)機(jī)上,每個(gè)web服務(wù)器要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,就可以直接訪問這個(gè)提供中間件服務(wù)的服務(wù)器。
還有一點(diǎn),考慮到性能問題,這里的提供服務(wù)的機(jī)子我們不使用html和xml傳輸數(shù)據(jù),一般使用TCP,UDP這層的通信。
因此ICE就是現(xiàn)在非常流行的網(wǎng)站開發(fā)中間件之一。
2 ICE通信結(jié)構(gòu)
ICE有分為提供服務(wù)的一方Server和尋求服務(wù)的一方Client,兩臺(tái)機(jī)子上都需要安裝ICE組件,他們的通信結(jié)構(gòu)如下:
Client端應(yīng)該事先知道Server端能提供的服務(wù)是什么,有什么格式?這就是圖中的Proxy Code,在Proxy Code中定義好了類和接口。Server端中接口定義的就是Skeleton,具體實(shí)現(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.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)
確認(rèn)機(jī)子是否安裝g++,如果沒有,則安裝:
yum install gcc-c++ libstdc++-devel
linux環(huán)境下安裝PHP中間件ICE
ICE的安裝方式有多種,這里以通過RPM的方式進(jìn)行安裝為例:
1、下載ICE安裝包:
wget http://www.zeroc.com/download/Ice/3.4/Ice-3.4.1-rhel5-i386-rpm.tar.gz
ICE各版本對(duì)系統(tǒng)有要求,下載之前需要確認(rèn)一下自己服務(wù)器的環(huán)境是否支持,我們這里下載的是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
這里我們可以根據(jù)自己的編程語(yǔ)言選擇相應(yīng)的安裝包,上面我們安裝了:c++、java、php
需要提醒的是,我們是通過rpm -ivh的方式進(jìn)行安裝,安裝過程中注意包之間的依賴關(guān)系,按順序安裝。默認(rèn)會(huì)安裝到/usr/ 目錄下,執(zhí)行文件在/usr/bin目錄下 include lib分別在/usr/include 和 /usr/lib 這里不用我多說…… 執(zhí)行下 slice2cpp 提示no input file 就證明ICE環(huán)境已經(jīng)可以工作啦。
另外,我們可以通過下面的兩個(gè)命令查看安裝的ICE版本
icegridnode --version icegridadmin --version
php中通過直接編譯的方式去安裝ICE
上面我們講過了在linux環(huán)境下通過rpm的方式來安裝ICE,這種安裝方式可以是比較簡(jiǎn)單的,自己在安裝過程中發(fā)現(xiàn)后面PHP無法裝在IcePHP.sp模塊,也有可能自己在安裝過程中某個(gè)地方出錯(cuò)了。又嘗試通過直接編譯的方式去安裝ICE,PHP也正常裝在了IcePHP.so模塊,大功告成,這里記錄一下方法。
以安裝ICE-3.4.2版本為例,為了方便管理,將ICE相關(guān)的軟件都安裝到/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 是一個(gè)高性能的,嵌入數(shù)據(jù)庫(kù)編程庫(kù),和C語(yǔ)言, C++, Java, Perl, Python, Tcl以及其他很多語(yǔ)言都有綁定。
# 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 開發(fā)并按照自由軟件/開源軟件協(xié)議發(fā)布的數(shù)據(jù)壓縮算法及程序。
# 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 是一個(gè) 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
編譯過程報(bào)錯(cuò):
../../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] 錯(cuò)誤 1 make[2]: Leaving directory `/data/software/Ice-3.4.2/cpp/src/FreezeScript' make[1]: *** [all] 錯(cuò)誤 1 make[1]: Leaving directory `/data/software/Ice-3.4.2/cpp/src' make: *** [all] 錯(cuò)誤 1
# make install
安裝過程報(bào)錯(cuò):
../../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] 錯(cuò)誤 1 make[2]: Leaving directory `/data/software/Ice-3.4.2/cpp/src/FreezeScript' make[1]: *** [install] 錯(cuò)誤 1 make[1]: Leaving directory `/data/software/Ice-3.4.2/cpp/src' make: *** [install] 錯(cuò)誤 1
修改
vim config/Make.rules.Linux
找到143行這里
BASELIBS = -lIceUtil -lpthread -lrt -liconv
在最后面增加-liconv, 執(zhí)行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、設(shè)置ICE環(huán)境變量
# 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
測(cè)試是否成功:
icegridnode --version icegridadmin --version
Linux環(huán)境下make編譯安裝ICE-3.3.0
Linux環(huán)境下make編譯安裝ICE-3.3.0
環(huán)境:
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修改相應(yīng)配置,并修改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
復(fù)制 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)、重啟服務(wù),查看php -m或phpinfo
# /usr/local/php/bin/php -m filter ftp gd gettext hash ice iconv json libxml
ICE提供 YUM 安裝,這種安裝方式最簡(jiǎn)單,但是安裝成功后,ICE默認(rèn)把PHP擴(kuò)展安裝到了系統(tǒng)默認(rèn)自帶的PHP中,一般情況下我們都不會(huì)自己使用linux系統(tǒng)自動(dòng)的PHP版本,而是自己重新安裝的,ICE通過YUM安裝的方式無法對(duì)PHP進(jìn)行安裝擴(kuò)展,這個(gè)問題有待解決。
4 寫一個(gè)ICE例子,目的:Client端每調(diào)用一次服務(wù),Server端就打出一個(gè)"hello world”;
基本環(huán)境:由于是實(shí)驗(yàn)?zāi)康?,我僅僅將Client和Server同當(dāng)做一臺(tái)CentOS機(jī)子
A 建文件夾: mkdir ice_demo
B 創(chuàng)建文件Printer.ice,這個(gè).ice文件是ICE的slice文件,在其中定義了服務(wù)的對(duì)象和接口
module Demo {
interface Printer {
void printString(string s);
};
};
C #slice2cpp Printer.ice //產(chǎn)生出了Printer.h和Printer.cpp兩個(gè)文件
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 //在同文件夾下會(huì)出現(xiàn):server執(zhí)行文件
F #slice2php Printer.ice
G 創(chuàng)建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
打開一個(gè)終端運(yùn)行 #./server
打開另一個(gè)終端運(yùn)行 php Client.php
發(fā)現(xiàn)每運(yùn)行一次Client.php,第一個(gè)終端就打出一個(gè)Hello World. ICE 運(yùn)行成功.
附注:大型的網(wǎng)站對(duì)于ICE的使用是很多的。比如需要實(shí)現(xiàn)一個(gè)分詞搜索的功能使用lucence,對(duì)數(shù)據(jù)庫(kù)的訪問,對(duì)memcached的訪問都可以直接在ICE中寫一個(gè)服務(wù)來提供統(tǒng)一管理和使用。
再貼個(gè)PHP使用ICE的簡(jiǎn)單代碼示例:
<?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; }
上面就是自己在調(diào)試ICE時(shí)使用的PHP代碼,不過在調(diào)用接口過程中會(huì)出現(xiàn)一些問題:
如果接口返回bool類型值,接口調(diào)用正常;
如果接口返回對(duì)象類型值,接口報(bào)錯(cuò),報(bào)"UnmarshalOutOfBoundsException"異常,正在查找這個(gè)問題是什么原因造成的。
過幾天再對(duì)ICE這個(gè)進(jìn)行總結(jié)一下...
搭建ICE服務(wù)端和客戶端的測(cè)試環(huán)境。
1、建立ice文件Printer.ice
module Demo{ interface Printer{ void printString(string s); }; };
2、執(zhí)行 slice2cpp Printer.ice 執(zhí)行成功后可以看到當(dāng)前目錄下生成了 Printer.cpp 和 Printer.h 兩個(gè)文件
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,執(zhí)行:
g++ -I. -I/usr/include -o server Printer.cpp Server.cpp -L/usr/lib -lIce -lIceUtil
成功后會(huì)在同一目錄中生成server可執(zhí)行文件。
5、創(chuàng)建PHP客戶端,執(zhí)行命令:
slice2php Printer.ice
成功后,會(huì)在同一目錄中生成Printer.php文件
6、創(chuàng)建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、打開一終端執(zhí)行:./server
8、打開另一終端執(zhí)行:php Client.php
執(zhí)行成功后,我們發(fā)現(xiàn)每執(zhí)行一次php Client.php都會(huì)在服務(wù)終端輸出 Hello World!
在php中使用ice教程
前面我們已經(jīng)在linux環(huán)境下成功安裝了支持PHP的ICE環(huán)境,接下來就是怎么在PHP使用ICE了。
1、修改PHP配置文件php.ini,載入ICE擴(kuò)展
vim /usr/local/php/etc/php.ini
添加:
extension = "IcePHP.so"
重啟服務(wù)
/etc/init.d/php-fpm reload
查看ICE是否載入成功:
1)通過命令查看已安裝PHP擴(kuò)展
[root@localhost ~]# php -m
顯示:
gettext gmp hash ice iconv libxml
可以看到有ICE的身影了,說明已經(jīng)成功了。
另外也可以通過phpinfo的方式查看:
接下來就是在應(yīng)用中載入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:
PHPini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '/usr/share/php'); require 'Ice.php'; // Load the core Ice run time definitions.
ICE常見編譯和運(yùn)行(異常)錯(cuò)誤
在編譯和 Ice 應(yīng)用相關(guān)的文件中,經(jīng)常因?yàn)?ice 相關(guān)的文件包含關(guān)系而導(dǎo)致編譯無法通過,此時(shí)的錯(cuò)誤一般提示和 handle.h 相關(guān)。然而想要解決這樣的錯(cuò)誤,一般只需要把在無法編譯成 .o 文件的 .cpp 文件中和 ice 文件相關(guān)的頭文件放在該 .cpp 文件的起始行即可。也就是說,根據(jù)提示,把 .cpp 文件中最早提示導(dǎo)致出錯(cuò)的 .h 文件放在起始行。
ICE 的常見運(yùn)行錯(cuò)誤 ( 異常 ):
1 使用的地址錯(cuò)誤 ,IP 并非本地 IP: 發(fā)生在初始化服務(wù)器時(shí) , 沒辦法初始化 adapter.
錯(cuò)誤信息 : (IP 錯(cuò)誤 )
./test: Network.cpp:475: Ice::SocketException: socket exception: Cannot assign requested address
另外 : 已經(jīng)啟動(dòng)服務(wù)器后又重新啟動(dòng) : 發(fā)生在初始化服務(wù)器時(shí) , 沒辦法初始化 adapter.
錯(cuò)誤信息 : (port 已經(jīng)被使用 )
./server: Network.cpp:475: Ice::SocketException: socket exception: Address already in use
///stringtoProxy 對(duì)于任何 string 都是有效的 , 均可以生成相應(yīng)代理 , 但是該代理是否有效是無法保證的 . 如果代理無效 , 也就是說根本就沒有這樣的 adapter 或者對(duì)象 , 那么使用 Checkcast 或直接用該代理調(diào)用相應(yīng)對(duì)象接口均會(huì)拋異常 . 下面對(duì)每種情況加于分析 .
2 使用的代理 IP 錯(cuò)誤 : 發(fā)生在使用代理調(diào)用接口的時(shí)候
原因 : 根本就沒有相應(yīng)的通訊器存在 .
錯(cuò)誤信息 : ( 使用的代理 IP 錯(cuò)誤 )
拋出異常 : Ice::ConnectFailedException ( 需要幾秒 , 需要進(jìn)行搜索 )
3 使用的代理端口錯(cuò)誤 , 兩邊不一致 : 發(fā)生在使用代理調(diào)用接口的時(shí)候
原因 : 存在通訊器 , 但是不存在相應(yīng)的對(duì)象適配器 .
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 , 端口沒有被啟用引起的 , 無人監(jiān)聽該端口 )
4 使用的對(duì)象名字不正確 : 發(fā)生在使用代理調(diào)用接口的時(shí)候
原因 : 能夠找到相應(yīng)的對(duì)象適配器 , 但是該對(duì)象適配器中無法找到相應(yīng)的對(duì)象
錯(cuò)誤信息 :
拋出異常 : Ice::ObjectNotExistException ( 很快 )
5 對(duì)方程序沒用啟用 , 也就是服務(wù)器沒有啟用 : 發(fā)生在使用代理調(diào)用接口的時(shí)候
原因 : 根本就沒有相應(yīng)的通訊器存在 .
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
6 連接突然斷開 ( 比如對(duì)方因?yàn)槎五e(cuò)誤而程序停止 , 或者在連接過程中正常關(guān)閉 ) : 發(fā)生在使用代理調(diào)用接口的時(shí)候 ( 連接丟失 )
原因 : 已經(jīng)建立連接的對(duì)方突然斷開
錯(cuò)誤信息 :
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
( 服務(wù)器端的錯(cuò)誤 , 使用 createObjectAdapter() 創(chuàng)建對(duì)象適配器 )
7 服務(wù)器端沒有指定 adapter 的端口和 ip, 僅僅隨便給了一個(gè)名字 , 并使用該名字從配置文件中讀取信息 : 啟動(dòng)服務(wù)器時(shí)沒有問題正常 , 但是客戶端無法連接
原因 : 對(duì)象適配器無效來源 幫客之家www。bkjia.com
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
8 啟動(dòng)服務(wù)器時(shí) , 給定的 adapter 的名字和配置文件中使用的不一致 : 啟動(dòng)服務(wù)器時(shí)沒有問題正常 , 但是客戶端無法連接 ( 無法從配置文件中獲取所需要的信息 port 和 ip)
原因 : 對(duì)象適配器無效
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
9 配置文件中的名字和程序中給定的 adapter 名字一致 , 也就是說缺少 Endpoints, 作為后綴 . 啟動(dòng)服務(wù)器時(shí)沒有問題正常 , 但是客戶端無法連接 ( 無法從配置文件中獲取所需要的信息 port 和 ip)
原因 : 對(duì)象適配器無效
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
10 配置文件中的名字后綴 Endpoints 寫錯(cuò) , 比如 Endpoint. 啟動(dòng)服務(wù)器時(shí)沒有問題正常 , 但是客戶端無法連接 ( 無法從配置文件中獲取所需要的信息 port 和 ip)
原因 : 對(duì)象適配器無效
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
11 程序中給定的 adapter 名字多了后綴 Endpoints( 或者其他字符 , 甚至是 ”.”). 啟動(dòng)服務(wù)器時(shí)沒有問題正常 , 但是客戶端無法連接 ( 無法從配置文件中獲取所需要的信息 port 和 ip)
原因 : 對(duì)象適配器無效
錯(cuò)誤信息 :
拋出異常 : Ice::ConnectionRefusedException ( 很快 )
( 說明 : 也就是說配置文件中必須有 Endpoints 作為后綴 , 而在程序中給定 adapter 的名字是一定不能帶該后綴 , 不然服務(wù)器無法正常工作 )
win7下手動(dòng)配置apache+php+mysql記
本來想學(xué)學(xué)php,于是就想搭建web服務(wù)器和sql環(huán)境,結(jié)果浪費(fèi)掉了不少時(shí)間。大致的總結(jié)下,也算是長(zhǎng)個(gè)記性。使用的安裝包分別是httpd-2.2.22-win32-x86-no_ssl.msi,php-5.2.5-Win32.zip和mysql-installer-communit...
OneinStack一鍵PHP/JAVA/HHVM安裝及VPS手動(dòng)安裝LNMP
說起LNMP,多數(shù)人應(yīng)該知道lnmp.org站長(zhǎng)開發(fā)的LNMP一鍵安裝包,該腳本虛擬主機(jī)管理、FTP用戶管理、Nginx、MySQL/MariaDB、PHP的升級(jí)、常用緩存組件的安裝、重置MySQLroot密...
PHP遭棄用!Wordpress.com開源并轉(zhuǎn)用Javascript
據(jù)外媒消息稱,Wordpress母公司Automattic將完全重寫Wordpress.com網(wǎng)站代碼,并將此項(xiàng)計(jì)劃命名為“Calypso”,代碼開源并被托管于Github平臺(tái)。此外,最新的wordpress.com放...
分享6款國(guó)內(nèi)、外開源PHP輕論壇CMS程序
隨著移動(dòng)互聯(lián)網(wǎng)對(duì)于傳統(tǒng)互聯(lián)網(wǎng)的沖擊,用戶群更加注重信息的及時(shí)性和有效性的簡(jiǎn)便分享和獲取,傳統(tǒng)的社區(qū)模式經(jīng)過多年的積累沉淀很深,尤其對(duì)于新興的社區(qū)用戶群和站長(zhǎng)來說...
【php爬蟲】百萬級(jí)別知乎用戶數(shù)據(jù)爬取與分析
本程序是抓取知乎的用戶數(shù)據(jù),要能訪問用戶個(gè)人頁(yè)面,需要用戶登錄后的才能訪問。當(dāng)我們?cè)跒g覽器的頁(yè)面中點(diǎn)擊一個(gè)用戶頭像鏈接進(jìn)入用戶個(gè)人中心頁(yè)面的時(shí)候,之所以能夠看到...
FreeHostia免費(fèi)PHP空間中文面板250MB空間6GB流量
FreeHostia這類空間提供中文主機(jī)控制面板,有域名綁定、MysqL管理、在線文件管理器、PHP配置調(diào)整等,特別適合新手朋友們體驗(yàn)建站,搭建一個(gè)屬于個(gè)人的博客。...