文档章节

thrift php服务器端开发

penngo
 penngo
发布于 2015/08/25 18:01
字数 623
阅读 4790
收藏 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
博文 99
码字总数 55711
作品 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 RPC基础学习总结

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

IamOkay
2017/12/21
0
0
[Thrift]Apache Thrift入门Java实例

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

sjf0115
2016/09/21
0
0
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

没有更多内容

加载失败,请刷新页面

加载更多

正弦 余弦 角度 用于画时钟

<html> <head> <title>时钟</title> </head> <style> #canvas{ background: #1977ca } </style>......

一箭落旄头
11分钟前
1
0
drupal7自定义模块之表单(新手向)

前段时间要给网站做个高级搜索的功能,但drupal7自带的搜索远远无法满足需求,便有了自己开发的需求 我以前没有接触过drupal,做这个功能也是困难重重,几乎是从零开始,我将目光放到了自定义模块...

gcudwork
16分钟前
0
0
驰狼课堂

http://www.chilangedu.com/

求是科技
33分钟前
0
0
jumpserver 报错"Incorrect string value

申明 本文所有内容参考自jumpserver记录命令无法入库问题 #1773 简介 jumpserver 1.4.0在jumpserver.log中大量报错,错误日志 File "/opt/jumpserver/apps/terminal/api.py", line 246, i...

zhnxin
39分钟前
2
0
用户管理相关配置文件及命令

9月19日任务 2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 扩展知识 实用小工具 简单命令行下实现Linux/Windows文件互传 前提:使用远程工具Xsh...

robertt15
58分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部