文档章节

thrift php服务器端开发

penngo
 penngo
发布于 2015/08/25 18:01
字数 623
阅读 4891
收藏 8

在前文(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
粉丝 78
博文 102
码字总数 58167
作品 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,我咋弄?
[Thrift]Apache Thrift入门Java实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/52606287 1. 概述 Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语...

sjf0115
2016/09/21
0
0
PHP Thrift Rpc 远程调用框架 --workerman-thrift

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

domr
2014/04/13
2.4K
1
Thrift RPC基础学习总结

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

IamOkay
2017/12/21
0
0
跨语言服务部署框架Thrift简介[转]

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

强子哥哥
2016/06/25
359
0
Golang通过Thrift框架完美实现跨语言调用

  每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序。   做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯。采用http协议简单,但性能不高。采用...

qinerg
2013/09/29
0
19

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
12
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部