PHP沒有中間件,導致了對很多麻煩。比如,對數據庫的操作必須要鏈接數據庫,然后做SQL操作。WEB程序直接操作數據庫的方法,這樣會帶來很多人為因素的事故隱患,以及管理上的麻煩,尤其是對大型的網站應用來說。規范的模式應該是,WEB程序傳遞參數到一個服務程序上,由該服務程序進行判斷并最終操作數據庫或者其它數據文件,這樣做到了明確權限控制,和業務類型集中管理。去年伴隨著ICE的推出,PHP終于有了可以使用的中間件。在PHP的發展史上,應該是一個里程碑。
ICE入門
ICE(Internet Communications Engine 網絡通訊引擎),是由Corba原核心成員開發的一個開源中間件,據稱其各種性能完全優于Corba。除此之外,我們第一次見到了直接支持PHP的中間件。
ICE的安裝,去 下載一個Ice針對PHP的安裝包,按照說明安裝上。
ICE的使用:使用Slice(ICE的一種簡單語法腳本),編寫一個xx.ice文件。可以使用slice2cpp或slice2java等生成一個cpp或java的ICE框架程序,然后在這個框架程序中進行代碼編寫。ICE在PHP的應用繼承了PHP的一貫傳統——簡單,只需要在php.ini中加載該xx.ice,在PHP中就可以使用了。
ICE在PHP應用中的缺點,無法使用PHP編寫Server端,其實這也是PHP的一個缺陷——沒有完善的多進程和多線程管理機制。因此,Server端可以采用ICE所支持的其它語言進行編寫,比如JAVA/C++/VB/PYTHON等。
開始傳說中的“互聯互通”
本例以 Ice 3.2.1為例 下載的位置和參考的文檔都在下面
ICE其實是一個網絡框架,入門說明中說了,PHP不能用來做服務端,在這里我們使用java來做服務端,用php來連java,達到傳說中的“互聯互通”。
我們的服務端用Linux,客戶端也用Linux(純廢話)。JAVA環境的搭建不在表述了。
在下載可以看出來,服務器支持yum或者是rpm是多么幸福的一件事情,或者搞一份tar.gz的包下來configure make make install,大概也就是這樣。好了這樣子就表示安裝結束了。。。
安裝之后的Ice相關路徑:
slice2cpp,slice2java在/usr/bin/下
Ice.jar 存儲于 /usr/share/java/下
相關的Ice的庫存儲于/usr/lib下.
第1步,建立服務器端的demo.ice的文件(注意代碼里的半全角,如果是全角自行轉成半角):
module Demo{
interface test{
string ? execute(string mth,string cmd);
};
};
第2步,執行:?slice2java demo.ice 生成一堆文件。。。
第3步,動手干活
上一步執行完會在當前目錄產生一個Demo目錄,目錄下自動生成:
-rw-r–r–? 1 root root 2316? 4月 15 17:01 _testDelD.java
-rw-r–r–? 1 root root? 560? 4月 15 17:01 _testDel.java
-rw-r–r–? 1 root root 1929? 4月 15 17:01 _testDelM.java
-rw-r–r–? 1 root root 4177? 4月 15 17:01 _testDisp.java
-rw-r–r–? 1 root root 1070? 4月 15 17:01 testHolder.java
-rw-r–r–? 1 root root? 488? 4月 15 17:01 test.java
-rw-r–r–? 1 root root? 481? 4月 15 17:01 _testOperations.java
-rw-r–r–? 1 root root? 460? 4月 15 17:01 _testOperationsNC.java
-rw-r–r–? 1 root root 5418? 4月 15 17:01 testPrxHelper.java
-rw-r–r–? 1 root root? 569? 4月 15 17:01 testPrxHolder.java
-rw-r–r–? 1 root root? 567? 4月 15 17:01 testPrx.java
到目前為止,demo.ice所以Ice接口部分的定義以及相關依賴都已經自動生成.
我們要實現自己的execute方法,覆蓋testPrx.java的同名:
//TestImp.java
package Demo;
import Ice.Current;
public class TestImp extends _testDisp{
public String execute(String mth, String cmd, Current __current) {
// TODO Auto-generated method stub
return mth+cmd;
}
}
第4步,建立一個Server服務在10000進行偵聽
//Server.java
package Demo;
public class Server {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
“TestAdapter”, “default -p 10000″);
Ice.Object object = new TestImp();
adapter.add(object, ic.stringToIdentity(”TestAdapter”));
adapter.activate();
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
// Clean up
//
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}
以上大部分代碼都是框架生成,你只需要在里面填寫TODO。把這個代碼拖回來用eclipse打成jar包,注意,需要依賴ice.jar這個包,這個包可以在網站下載到。
生成DemoServer.ajr后傳到服務器,運行java -cp ./:Ice.jar:DemoServer.jar Demo.Server
運行成功的條件是Ice.jar和DemoServer.jar都在一個目錄里。(Ice.jar從下載地址下載)
Server運行之后監聽于10000端口,需要修改iptables,允許其他機器可以連接。
編輯 iptables
vi /etc/sysconfig/iptables
-A?RH-Firewall-1-INPUT?-m?state?–state?NEW?-m?tcp?-p?tcp?–dport10000-j?ACCEPT
繼續深入互聯互通
這一節完成了Server,一個10000端口的Server在等待著我們用PHP來聯通中。下一節,我們將講述:IcePHP環境的搭建,PHP調用Ice如何與JAVA互聯互通,以及一個完整的Demo,保存好本節的代碼,后面還有用處。[未完待續]
轉載自[]
本文鏈接: