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等方式運行,從而獲得更好的性能。