文档章节

thrift php服务器端开发

penngo
 penngo
发布于 2015/08/25 18:01
字数 623
阅读 4626
收藏 8
点赞 2
评论 12

在前文(Thrift的java和php数据交互http://my.oschina.net/penngo/blog/489311)中只介绍了java作服务器端,但是“php是最好的语言”,自然少了php开发的thrift服务器端。

使用的业务例子,还是以前文的登录和注册为例


服务器端由php代码编写,客户端由php和java编写。

PhpMulServer.php (注意需要使用apache或其它web服务器来运行,由于thrift自身没有提供负载均衡,可考虑用LVS、HAProxy、 Nginx等等对HTTP请求做负载均衡处理)

<?php
namespace com\penngo;
error_reporting(E_ALL);
require_once __DIR__.'/../lib/Thrift/ClassLoader/ThriftClassLoader.php';
use Thrift\ClassLoader\ThriftClassLoader;

$GEN_DIR = realpath(dirname(__FILE__).'/..').'/gen-php';
$loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', __DIR__ . '/../lib');
$loader->registerDefinition('com', $GEN_DIR);
$loader->register();

if (php_sapi_name() == 'cli') {
  ini_set("display_errors", "stderr");
}

use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TPhpStream;
use Thrift\Transport\TBufferedTransport;
use Thrift\TMultiplexedProcessor;
use com\penngo\User;

class RegisterServiceHandler implements \com\penngo\RegisterServiceIf {
    public function createUser($name, $psw){
        $user = new User();
        $user->id = 2;
        $user->name = $name;
        $user->password = $psw;
        return $user;
    }
};
class LoginServiceHandler implements \com\penngo\LoginServiceIf {
    public function login($name, $psw){
        $user = new User();
        if($name == 'penngo' && $psw == '123'){
            $user->id = 1;
            $user->name = 'penngo';
        }
        return $user;
    }
};
header('Content-Type', 'application/x-thrift');
if (php_sapi_name() == 'cli') {
  echo "\r\n";
}

$transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W));
$protocol = new TBinaryProtocol($transport, true, true);
$tMultiplexedProcessor = new TMultiplexedProcessor();

$handler = new LoginServiceHandler();
$loginServiceProcessor = new LoginServiceProcessor($handler);
$tMultiplexedProcessor->registerProcessor("LoginService", $loginServiceProcessor);

$registerService = new RegisterServiceHandler();
$registerServiceProcessor = new RegisterServiceProcessor($registerService);
$tMultiplexedProcessor->registerProcessor("RegisterService", $registerServiceProcessor);
$transport->open();
$tMultiplexedProcessor->process($protocol, $protocol);
$transport->close();


php客户端调用

PhpMulClient.php

<?php
namespace com\penngo;
error_reporting(E_ALL);
require_once __DIR__.'/../lib/Thrift/ClassLoader/ThriftClassLoader.php';

use Thrift\ClassLoader\ThriftClassLoader;

$GEN_DIR = realpath(dirname(__FILE__).'/..').'/gen-php';

$loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', __DIR__ . '/../lib');
$loader->registerDefinition('com', $GEN_DIR);
$loader->register();

use Thrift\Protocol\TBinaryProtocol;
use Thrift\Protocol\TMultiplexedProtocol;
use Thrift\Transport\THttpClient;
use Thrift\Transport\TBufferedTransport;
use Thrift\Exception\TException;

try {
$socket = new THttpClient('localhost', 80, '/thrift/penngo/PhpMulServer.php');
//   $socket = new THttpClient('localhost', 8090, '/thrift/penngo/PhpMulServer.php');
  $transport = new TBufferedTransport($socket);
  $protocol = new TBinaryProtocol($transport);
  $loginProtocol = new TMultiplexedProtocol($protocol, 'LoginService');
  $loginService = new LoginServiceClient($loginProtocol);

  $user = $loginService->login('penngo', '123');
  var_dump($user);

  $registerProtocol = new TMultiplexedProtocol($protocol, 'RegisterService');
  $registerService = new RegisterServiceClient($registerProtocol);
  $user = $registerService->createUser('penngo', '123');
  var_dump($user);
//   $transport->close();
} catch (TException $tx) {
  print 'TException: '.$tx->getMessage()."\n";
}

?>


java客户端

HttpClient.java

package com.penngo.main;

import org.apache.thrift.*;
import org.apache.thrift.protocol.*;
import org.apache.thrift.transport.*;
import com.penngo.LoginService;
import com.penngo.RegisterService;
import com.penngo.User;

public class HttpClient {
	public static void main(String[] args) {
		try {
			THttpClient transport = new THttpClient("http://localhost:80/thrift/penngo/PhpMulServer.php");
			TProtocol protocol = new TBinaryProtocol(transport);
			TMultiplexedProtocol mp1 = new TMultiplexedProtocol(protocol,
					"LoginService");
			LoginService.Client loginClient = new LoginService.Client(mp1);
			TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol,
					"RegisterService");
			RegisterService.Client registerClient = new RegisterService.Client(
					mp2);
//			transport.open();

			User user = loginClient.login("penngo", "123");
			if (user != null) {
				System.out.println("登录成功:" + user.getId() + " "
						+ user.getName());
			} else {
				System.out.println("登录失败");
			}
			User user2 = registerClient.createUser("test", "123");
			if (user2 != null) {
				System.out.println("创建用户成功:" + user2.getId() + " "
						+ user2.getName());
			} else {
				System.out.println("创建用户失败");
			}
//			transport.close();
		} catch (TException x) {
			x.printStackTrace();
		}
	}
}


© 著作权归作者所有

共有 人打赏支持
penngo
粉丝 76
博文 98
码字总数 55112
作品 2
广州
程序员
加载中

评论(12)

penngo
penngo

引用来自“w1y0t5”的评论

你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的

引用来自“penngo”的评论

RegisterServiceProcessor是自动生成的,主要是把接口服务公开。

引用来自“w1y0t5”的评论

我现在遇到了一个问题 就是类似的processor 并没有生成
namespace php Service.UsersService

service UsersService {
string resgister(1:string username,2:string password);
string login(1:string username,2:string password);
}
用 thrift --gen php users.service.thrift
只剩成了 一个 type.php 和 一个 UsesService.php 文件 usersserice.php内也米有 processor 这个是要添加什么参数吗?
试下这个thrift -gen php:server users.service.thrift,以前的文章有说过这问题。
w
w1y0t5

引用来自“w1y0t5”的评论

你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的

引用来自“penngo”的评论

RegisterServiceProcessor是自动生成的,主要是把接口服务公开。
我现在遇到了一个问题 就是类似的processor 并没有生成
namespace php Service.UsersService

service UsersService {
string resgister(1:string username,2:string password);
string login(1:string username,2:string password);
}
用 thrift --gen php users.service.thrift
只剩成了 一个 type.php 和 一个 UsesService.php 文件 usersserice.php内也米有 processor 这个是要添加什么参数吗?
penngo
penngo

引用来自“w1y0t5”的评论

你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的
RegisterServiceProcessor是自动生成的,主要是把接口服务公开。
w
w1y0t5
你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的
假装在纽约
假装在纽约
index.php 就是server.php
假装在纽约
假装在纽约
server {
listen 9090;
server_name localhost;
root /Users/workspace/develop/thrift-rpc-tutorial;
index index.php;

location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
假装在纽约
假装在纽约
我是这样的:
penngo
penngo

引用来自“小强中国”的评论

我用的是官方的tutorial.thrift,想做一个nodejs做client,php做server的例子,看到server.php中写到“This is not a stand-alone server. It should be run as a normal php web script (like through Apache's mod_php) or as a cgi script”,这句话对应你了说的“需要使用apache或其它web服务器来运行”, so, 我本地搭建了一个xxx.com服务器,吧server.php改为index.php丢到跟目录,然后浏览器打开xxx.com/index.php,但是报错了:“Fatal error: Uncaught exception 'Thrift\Exception\TException' with message 'TPhpStream: Could not read 4 bytes' ”,我直接蒙蔽了。求大神指出问题。

引用来自“penngo”的评论

浏览器肯定不能直接访问,需要用thrift的客户端来访问。

引用来自“小强中国”的评论

哥貌似没仔细看我的问题哦,我主要是想问如何启动这个server.php,求赐教。我目前是想实现nodejs做客户端,php做服务端,但是这个php服务依赖nginx,我咋弄?
需要把thrift相关库文件和server.php放进nginx,注意server.php引用的thrift文件路径别弄错。
假装在纽约
假装在纽约

引用来自“小强中国”的评论

我用的是官方的tutorial.thrift,想做一个nodejs做client,php做server的例子,看到server.php中写到“This is not a stand-alone server. It should be run as a normal php web script (like through Apache's mod_php) or as a cgi script”,这句话对应你了说的“需要使用apache或其它web服务器来运行”, so, 我本地搭建了一个xxx.com服务器,吧server.php改为index.php丢到跟目录,然后浏览器打开xxx.com/index.php,但是报错了:“Fatal error: Uncaught exception 'Thrift\Exception\TException' with message 'TPhpStream: Could not read 4 bytes' ”,我直接蒙蔽了。求大神指出问题。

引用来自“penngo”的评论

浏览器肯定不能直接访问,需要用thrift的客户端来访问。
可以的话,求加Q:798600897
假装在纽约
假装在纽约

引用来自“小强中国”的评论

我用的是官方的tutorial.thrift,想做一个nodejs做client,php做server的例子,看到server.php中写到“This is not a stand-alone server. It should be run as a normal php web script (like through Apache's mod_php) or as a cgi script”,这句话对应你了说的“需要使用apache或其它web服务器来运行”, so, 我本地搭建了一个xxx.com服务器,吧server.php改为index.php丢到跟目录,然后浏览器打开xxx.com/index.php,但是报错了:“Fatal error: Uncaught exception 'Thrift\Exception\TException' with message 'TPhpStream: Could not read 4 bytes' ”,我直接蒙蔽了。求大神指出问题。

引用来自“penngo”的评论

浏览器肯定不能直接访问,需要用thrift的客户端来访问。
哥貌似没仔细看我的问题哦,我主要是想问如何启动这个server.php,求赐教。我目前是想实现nodejs做客户端,php做服务端,但是这个php服务依赖nginx,我咋弄?
PHP Thrift Rpc 远程调用框架 --workerman-thrift

workerman thrift rpc 是一个以workerman作为服务器容器,使用Thrift协议及其传输层模块搭建起来的跨语言的RPC远程调用框架。 workerman-thrift-rpc的目标是解决异构系统之间通信的问题,wor...

domr
2014/04/13
2.4K
1
Thrift的java和php数据交互

Thrift是一个软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发,封装了数据传输格式(二进制、json)和网络通信的服务框架,提供多语言(C++, Java, Python, PHP, Ruby, E...

penngo
2015/08/07
0
4
thrift使用介绍

原文出处:http://gemantic.iteye.com/blog/1199214 一、About thrift 二、什么是thrift,怎么工作? 三、Thrift IDL 四、Thrift Demo 五、Thrift 协议栈 以及各层的使用(java 为例) 六、与...

ponpon_
2014/07/07
0
0
跨语言服务部署框架Thrift简介[转]

参考文档: http://dongxicheng.org/search-engine/thrift-framework-intro/ Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间...

强子哥哥
2016/06/25
359
0
Apache Thrift介绍

Thrift是为了解决facebook系统中各系统之间大数据量的传输通讯以及系统之间语言环境不同需要跨平台这一特性而创造的。所以thrift可以支持多种程序语言,例如: C++, C#, Cocoa, Erlang, Haske...

吕坤
2013/02/19
0
0
RPC框架Thrift例子-PHP调用C++后端程序

前言 前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错! 本文项目地址: https://github.com/zekunyan/ThriftDemoPHP_CPP 先看看本文的例子示...

snowing1990
2016/08/16
69
0
facebook thrift框架讲解

简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Coco...

tqyin
2016/09/29
4K
2
python thrift 服务端与客户端使用

一、简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, C...

wangfeng7399
2015/09/18
0
0
Thirft框架介绍

1、前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编...

nothingfinal
2014/05/20
0
0
基于Thrift的java和PHP互相调用范例

首先我们看看 Thrift是什么? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang,...

r00txx
2016/09/09
239
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部