程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php實現的thrift socket server

php實現的thrift socket server

編輯:關於PHP編程

 

php-thrift-server源碼
代碼直接從apache的thrift項目clone過來,托管在github上:

http://github.com/volca/thrift

新增或改動的代碼如下:

lib/php/
`-- src
    |-- server
    |   |-- TNonblockingServer.php
    |   `-- TServer.php
    `-- transport
        |-- TNonblockingServerSocket.php
        |-- TNonblockingSocket.php
        |-- TServerSocket.php
        |-- TServerTransport.php
test/php
|-- TestClient.php
|-- TestNonblockingServer.php
使用示例
獲取thrift的源碼,並編譯出thrift工具,編譯過程請搜索

git clone git://github.com/volca/thrift.git安裝php,以及apc, libevent擴展:

pecl install apc#需要先libevent-devel之類的包包pecl install libevent運行php的socket服務器,我直接從thrift的test代碼中修改了一個獨立運行的php server,見thrift/test/php/TestNonblockingServer.php,這裡也包含一個測試業務代碼的實現。

cd thrift/test/php#用thrift命令行工具生成php的測試類庫make#啟動thrift服務,會監聽本機的9090端口php TestNonblockingServer.php客戶端的代碼也一並提供,對各種數據類型比如int, float, string, list等等進行測試。

php TestClient.php性能測試
apache + php的測試結果

testVoid() = voidtestString("Test") = "Test"testByte(1) = 1testI32(-1) = -1testI64(-34359738368) = -34359738368testDouble(-852.234234234) = -852.234234234testStruct({"Zero", 1, -3, -5}) = {"Zero", 1, -3, -5}testNest({1, {"Zero", 1, -3, -5}), 5} = {1, {"Zero", 1, -3, -5}, 5}testMap({0 => -10, 1 => -9, 2 => -8, 3 => -7, 4 => -6}) = {0 => -10, 1 => -9, 2 => -8, 3 => -7, 4 => -6}testSet({-2, -1, 0, 1, 2}) = {1, 1, 1, 1, 1}testList({-2, -1, 0, 1, 2}) = {-2, -1, 0, 1, 2}testEnum(ONE) = 1testEnum(TWO) = 2testEnum(THREE) = 3testEnum(FIVE) = 5testEnum(EIGHT) = 8testTypedef(309858235082523) = 309858235082523Total time: 41 msphp + libevent的socket server測試結果

testVoid() = voidtestString("Test") = "Test"testByte(1) = 1testI32(-1) = -1testI64(-34359738368) = -34359738368testDouble(-852.234234234) = -852.234234234testStruct({"Zero", 1, -3, -5}) = {"Zero", 1, -3, -5}testNest({1, {"Zero", 1, -3, -5}), 5} = {1, {"Zero", 1, -3, -5}, 5}testMap({0 => -10, 1 => -9, 2 => -8, 3 => -7, 4 => -6}) = {0 => -10, 1 => -9, 2 => -8, 3 => -7, 4 => -6}testSet({-2, -1, 0, 1, 2}) = {1, 1, 1, 1, 1}testList({-2, -1, 0, 1, 2}) = {-2, -1, 0, 1, 2}testEnum(ONE) = 1testEnum(TWO) = 2testEnum(THREE) = 3testEnum(FIVE) = 5testEnum(EIGHT) = 8testTypedef(309858235082523) = 309858235082523Total time: 8 ms這個測試中,沒有耗時很長的請求,處理邏輯完全一樣,php socket server耗時僅為apache + php的五分之一。

thrift是什麼?
thrift流傳的似乎不是太廣泛,而且有被別的技術替代的趨勢,所以下面還是引用一下別的文章的介紹:

Thrift由一個軟件庫和一系列的代碼生成工具組成,由 Facebook開發。目的是為了加快軟件開發和實現高效和可擴展的後台服務。主要目標是不同程序開語言之間實現高效和可靠的通信,這需要將不同語言之間抽象出一個通用層,然後由不同語言來實現這個通用層。在這裡要特別指出的是,Thrift允許開發人員定義數據類型和服務接口(定義在一個中性語言文件裡),並通過這個文件生成構建RPC客戶端和服務端所需的代碼。

簡單分析其機理,Thrift就是實現C/S模式,通過代碼生成工具將接口定義文件生成服務器端和客戶端代碼(可以為不同語言),從而實現服務端和客戶端跨語言的支持。

Thrift可以分為傳輸層和協議層:

傳輸層定義了數據的傳輸方式,可以為TCP/IP傳輸,內存共享或者文件共享等形式;
協議層定義了數據的傳輸格式,可以為二進制流或者XML等形式。
當服務器端使用socket協議時,可以用simple|thread-pool|threaded|nonblocking等方式運行,從而獲得更好的性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved