• Stars
    star
    274
  • Rank 150,274 (Top 3 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 11 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Thrift RPC for php based on workerman.

workerman

workerman 是一个高性能的PHP socket服务框架,开发者可以在这个框架下开发各种网络应用,例如Rpc服务、聊天室、游戏等。 workerman 具有以下特性

  • 多进程
  • 支持TCP/UDP
  • 支持各种应用层协议
  • 使用libevent事件轮询库,支持高并发
  • 支持文件更新检测及自动加载
  • 支持服务平滑重启
  • 支持长连接
  • 支持以指定用户运行worker进程

更多请访问www.workerman.net

所需环境

workerman需要PHP版本不低于5.3,只需要安装PHP的Cli即可,无需安装PHP-FPM、nginx、apache workerman不能运行在Window平台

安装

1、下载 或者 git clone https://github.com/walkor/workerman-thrift

2、运行 composer install

启动停止

以ubuntu为例

启动
php start.php start -d

重启启动
php start.php restart

平滑重启/重新加载配置
php start.php reload

查看服务状态
php start.php status

停止
php start.php stop

在WorkerMan上使用Thrift

安装Thrift

以ubuntu安装Thrift为例

  • 首先安装Thrift依赖的扩展包
    sudo apt-get install libboost-dev automake libtool flex bison pkg-config g++
  • 下载Thrift
    http://thrift.apache.org/download/
  • 解压缩后安装
    sudo ./configure && sudo make && sudo make install

使用Thrift

定义一个Thrift的IDL文件 HelloWorld.thrift

namespace php Services.HelloWorld
service HelloWorld
{
    string sayHello(1:string name);
}  

注意:命名空间统一使用 Services.服务名

编译接口文件

thrift -gen php:server HelloWorld.thrift

拷贝编译好的文件到workerman下的目录

cp ./gen-php/Services/HelloWorld /yourdir/workerman/applications/ThriftRpc/Services/ -r

编写handler文件

在Applications/ThriftRpc/Services/HelloWorld/目录下创建HelloWorldHandler.php如下

<?php
// 统一使用Services\服务名 做为命名空间
namespace Services\HelloWorld;

class HelloWorldHandler implements HelloWorldIf {
  public function sayHello($name)
  {
      return "Hello $name";
  }
}

初始化

在Applications/ThriftRpc/start.php 中初始化服务,包括进端口和程数

require_once __DIR__ . '/ThriftWorker.php';

// helloworld
$hello_worker = new ThriftWorker('tcp://0.0.0.0:9090');
$hello_worker->count = 16;
$hello_worker->class = 'HelloWorld';

// another worker
//$another_worker = new ThriftWorker('tcp://0.0.0.0:9091');
//$another_worker->count = 16;
//$another_worker->class = 'AnotherClass';

运行

进入workerman-thrift根目录运行

php start.php start -d

workerman-Thrift客户端的使用

workerman-Thrift客户端支持的特性

支持故障节点自动踢出及故障节点恢复检测

  • 当某个节点无法访问的时候,客户端会自动将该节点踢掉
  • 有一定的几率(默认5/10000,保证在有故障节点时业务成功率在99.95%以上)重新访问故障节点,用来探测故障节点是否已经存活
  • 故障节点自动踢出及节点恢复检测功能需要客户端PHP支持sysvshm

支持异步调用

  • workerman-Thrift客户端支持请求发送与接收返回分离
  • 业务可以通过一个客户端实例发送多个请求出去,但是不必立刻接收服务端回应
  • 待业务需要对应的服务端回应时再接收数据,使用服务器回应的数据
  • 异步调用实现了并行计算,可以大大的减少客户端业务的等待时间,极大的提高用户体验

workerman-Thrift客户端使用示例

<?php
    
    // 引入客户端文件
    require_once 'yourdir/workerman/applications/ThriftRpc/Clients/ThriftClient.php';
    use ThriftClient\ThriftClient;
    
    // 传入配置,一般在某统一入口文件中调用一次该配置接口即可
    ThriftClient::config(array(
                         'HelloWorld' => array(
                           'addresses' => array(
                               '127.0.0.1:9090',
                               '127.0.0.2:9191',
                             ),
                             'thrift_protocol' => 'TBinaryProtocol',//不配置默认是TBinaryProtocol,对应服务端HelloWorld.conf配置中的thrift_protocol
                             'thrift_transport' => 'TBufferedTransport',//不配置默认是TBufferedTransport,对应服务端HelloWorld.conf配置中的thrift_transport
                           ),
                           'UserInfo' => array(
                             'addresses' => array(
                               '127.0.0.1:9393'
                             ),
                           ),
                         )
                       );
    // =========  以上在WEB入口文件中调用一次即可  ===========
    
    
    // =========  以下是开发过程中的调用示例  ==========
    
    // 初始化一个HelloWorld的实例
    $client = ThriftClient::instance('HelloWorld');
    
    // --------同步调用实例----------
    var_export($client->sayHello("TOM"));
    
    // --------异步调用示例-----------
    // 异步调用 之 发送请求给服务端(注意:异步发送请求格式统一为 asend_XXX($arg),既在原有方法名前面增加'asend_'前缀)
    $client->asend_sayHello("JERRY");
    $client->asend_sayHello("KID");
    
    // 这里是其它业务逻辑
    sleep(1);
    
    // 异步调用 之 接收服务端的回应(注意:异步接收请求格式统一为 arecv_XXX($arg),既在原有方法名前面增加'arecv_'前缀)
    var_export($client->arecv_sayHello("KID"));
    var_export($client->arecv_sayHello("JERRY"));

workerman-Thrift及客户端目录结构

客户端放在了workerman/applications/ThriftRpc/Clients目录下

在workerman里面客户端和服务端共用了Lib 和 Services 目录,单独使用客户端时,如果客户端没有这两个目录,需要从workerman上将这两个目录拷贝过去

workerman/applications/ThriftRpc + 
                              |- Clients +
                              |          |- ThriftClient.php    // workerman-thrift客户端主文件
                              |          |- AddressManager.php  // 带故障节点踢出功能的地址管理器
                              |- Lib +
                              |      |- Thrift +                // Thrift自带的文件,这里实际上和服务端共用了一套
                              |                |- ........      
                              |- Services +                     // 服务相关的文件,这里实际上和服务端共用了一套
                                          |- HelloWorld +
                                          |             |- HelloWorld.php         // thrift生成的文件
                                          |             |- Types.php              // thrift生成的文件
                                          |             |- HelloWorldHandler.php  // 服务端需要写的文件,客户端不需要
                                          |- 其他服务 +
                                          |           |- ...............
                                          .           .
                                          .           .
                                          .           .

性能测试

环境

系统:Debian GNU/Linux 6.0
cpu :Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz * 24
内存:64G

WorkerMan:开启24个Worker进程处理业务请求
压测软件:loadrunner

业务逻辑

HelloWorld sayHello

结果

吞吐量:平均8200/S
内存占用:24*12M=288M
cpu平均使用率:55%
load:16
流量:15M/S

处理曲线平稳,无内存泄漏,无流量抖动

More Repositories

1

workerman

An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.
PHP
11,067
star
2

phpsocket.io

A server side alternative implementation of socket.io in PHP based on workerman.
PHP
2,284
star
3

webman

Probably the fastest PHP web framework in the world.
PHP
2,126
star
4

workerman-todpole

HTML5+WebSocket+PHP(Workerman) , rumpetroll server writen using php
PHP
1,844
star
5

workerman-chat

Websocket chat room written in PHP based on workerman.
PHP
1,185
star
6

GatewayWorker

Distributed realtime messaging framework based on workerman.
PHP
1,007
star
7

web-msg-sender

Web message pusher written in PHP based on workerman.
PHP
922
star
8

live-camera

Live camera based on HTML5+Canvas+Websocket+PHP (Workerman).
PHP
458
star
9

BrowserQuest-PHP

BrowserQuest server in PHP base on workerman. A PHP/HTML5/JavaScript multiplayer game experiment.
PHP
376
star
10

workerman-statistics

一个分布式统计监控系统 包含PHP客户端 、服务端
PHP
350
star
11

GatewayClient

Sdk For GatewayWorker
PHP
334
star
12

workerman-jsonrpc

workerman作为进程管理器,json作为协议的远程服务调用的框架
PHP
251
star
13

workerman-webrtc

php webrtc demo based on workerman
JavaScript
251
star
14

live-ascii-camera

利用HTML5将摄像头视频转换为ascii字符,通过websocket实时传输给其它页面。服务端使用workerman
PHP
215
star
15

php-socks5

socks5 proxy written in PHP based on workerman.
PHP
208
star
16

mqtt

Asynchronous MQTT client for PHP based on workerman.
PHP
203
star
17

php-http-proxy

HTTP proxy written in PHP based on workerman.
PHP
201
star
18

phptty

Share your terminal as a web application. PHP terminal emulator based on workerman.
PHP
173
star
19

workerman-vmstat

在浏览器里面显示以更友好的方式实时显示vmstats信息,包括内存、IO、cpu等信息
PHP
160
star
20

channel

Interprocess communication component for workerman
PHP
136
star
21

workerman-flappy-bird

flappy bird 多人在线版
PHP
119
star
22

webman-framework

webman-framework
PHP
116
star
23

workerman-for-win

workerman 3.x windows 版本(目前linux版本已经兼容windows,此版本不再维护)
PHP
109
star
24

workerman-queue

workerman 消息队列
PHP
107
star
25

GlobalData

进程间变量共享组件,用于分布式数据共享
PHP
73
star
26

workerman-todpole-web

小蝌蚪互动聊天室-适合虚拟空间使用(后端直接与workerman主机通讯。请保留页面上workerman的相关链接)
JavaScript
73
star
27

workerman-filemonitor

监控文件更新并自动reload workerman
PHP
67
star
28

workerman-manual

Workerman manual
PHP
65
star
29

crontab

A crontab written in PHP based on workerman
PHP
60
star
30

mysql

Long-living MySQL connection for daemon.
PHP
55
star
31

workerman-chat-for-win

workerman-chat windows版本
PHP
48
star
32

http-client

Asynchronous http client for PHP based on workerman.
PHP
47
star
33

rabbitmq

Asynchronous rabbitmq client for PHP based on workerman.
PHP
35
star
34

redis-queue

Message queue system written in PHP based on workerman and backed by Redis.
PHP
35
star
35

workerman-todpole-for-win

workerman-todpole-for-win
PHP
25
star
36

workerman.net

workerman.net主页源代码
PHP
25
star
37

phpsocket.io-emitter

PHP
23
star
38

workerman-MT

workerman多线程版本,同时支持Linux平台与Windows平台,接口与原Linux多进程版本兼容
PHP
22
star
39

redis

Asynchronous redis client for PHP based on workerman.
PHP
18
star
40

workerman-filemonitor-inotify

workerman文件监控并自动reload inotify版本
PHP
17
star
41

workerman-manual-zh

workerman中文手册
17
star
42

web-msg-sender-for-win

web-msg-sender for win
PHP
17
star
43

GatewayWorker-for-win

GatewayWorker for windows.
PHP
16
star
44

global-timer

Distributed timer for workerman.
PHP
15
star
45

phpsocket.io-for-win

PHP
12
star
46

webserver-example

PHP
10
star
47

stomp

Asynchronous Stomp client for PHP based on workerman.
PHP
8
star
48

tcp-proxy-demo

一个tcp代理服务器的demo
PHP
8
star
49

en.workerman.net

en.workerman.net
PHP
4
star
50

workerman-teach

PHP
4
star
51

gateway-doc

GatewayWorker manual
3
star