thrift php服务器端开发
博客专区 > penngo 的博客 > 博客详情
thrift php服务器端开发
penngo 发表于2年前
thrift php服务器端开发
  • 发表于 2年前
  • 阅读 3878
  • 收藏 8
  • 点赞 2
  • 评论 12

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 在前文中只介绍了java作服务器端,但是“php是最好的语言”,自然少了php开发的thrift服务器端。 使用的业务例子,还是以前文的登录和注册为例

在前文(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();
		}
	}
}


共有 人打赏支持
粉丝 69
博文 83
码字总数 51490
作品 2
评论 (12)
假装在纽约
我用的是官方的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

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

我用的是官方的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' ”,我直接蒙蔽了。求大神指出问题。
浏览器肯定不能直接访问,需要用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的客户端来访问。
哥貌似没仔细看我的问题哦,我主要是想问如何启动这个server.php,求赐教。我目前是想实现nodejs做客户端,php做服务端,但是这个php服务依赖nginx,我咋弄?
假装在纽约

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

我用的是官方的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
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文件路径别弄错。
假装在纽约
我是这样的:
假装在纽约
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;
}
}
假装在纽约
index.php 就是server.php
w1y0t5
你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的
penngo

引用来自“w1y0t5”的评论

你好,请问RegisterServiceProcessor 这个类是自动生成的还是 自己写的?这个是干什么用的
RegisterServiceProcessor是自动生成的,主要是把接口服务公开。
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

引用来自“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,以前的文章有说过这问题。
×
penngo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: