Avro用php请求python服务的例子

php中文网
发布: 2016-06-07 16:28:04
原创
1564人浏览过

avro是hadoop项目之一。主要用来支持数据密集型应用,它定义了一种数据格式并在多种编程语言中支持这种格式。我们最主要是用来操作cassandra,其次是以rpc的方式,实现语言之间的相互调用。 架构中有很多轻量的python脚本,比如,PHP接收到一个URL,需要调用

avro是hadoop项目之一。主要用来支持数据密集型应用,它定义了一种数据格式并在多种编程语言中支持这种格式。我们最主要是用来操作cassandra,其次是以rpc的方式,实现语言之间的相互调用。

架构中有很多轻量的python脚本,比如,PHP接收到一个URL,需要调用Python脚本,去取这个URL的标题,然后返回。之前是用cli从命令行直接调用,效果不是很好,经常会卡死,有时还会占用PHP的端口导致php-fpm无法启动。这种场景又不能用RabbitMQ之类的异步处理。所以用Avro实现了一个简单的调用,跑了一个多月,目前一切正常,现在分享相关代码。

原理:PHP和Python使用同一个Schema,用Python的HTTPServer做一个http服务,PHP端将数据以avro/binary的方式编码,传给Python,Python端以同样的方法解码,获得传递的数据,进行处理后返回结果给PHP端。

需要用到avro官方提供的Python模块和PHP库。用pip安装avro时,需要先安装libsnappy。

Schema

创建一个JSON文件,命名为avro-protocol.json,内容如下:

SmartB2B行业电子商务
SmartB2B行业电子商务

SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板

SmartB2B行业电子商务 0
查看详情 SmartB2B行业电子商务
{"namespace": "com.dmyz.avro",
    "protocol": "Post",
    "types": [
        {"name": "Action", "type": "record",
            "fields": [
                {"name": "url","type": "string"},
                {"name": "charset","type": "string"}
            ]
        }
    ],
    "messages": {
        "send": {
            "request": [{"name": "message", "type": "Action"}],
            "response": "string"
        }
    }
}
登录后复制

以上内容定义了一个Avro的protocol,Python端根据它的定义来接受参数,生成服务;PHP端不提供服务,所以实际上只用到了定义中schema(type节点部分)。

立即学习PHP免费学习笔记(深入)”;

Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO
?
import cgi
import json
from avro import io, ipc, protocol, schema
?
PROTOCOL_FILE = 'avro-protocol.json'
PROTOCOL_JSON = json.loads(open(PROTOCOL_FILE).read())
PROTOCOL = protocol.parse(open(PROTOCOL_FILE).read())
SCHEMA = schema.parse(json.dumps(PROTOCOL_JSON['types'][0]))
?
SERVER_ADDR = ('localhost', 9090)
?
class PostRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
?
        length       = int(self.headers.getheader('content-length'))
        post_data    = self.rfile.read(length)
?
        data_reader  = StringIO(post_data)
        decoder      = io.BinaryDecoder(data_reader)
?
        datum_reader = io.DatumReader(SCHEMA)
        data         = datum_reader.read(decoder)
        url          = data['url'])
        charset      = data['charset']
        #已经取得从PHP发过来的数据,在这里执行其他逻辑
        self.wfile.write('title') #返回取到的title
?
if __name__ == '__main__':
    server = HTTPServer(SERVER_ADDR, PostRequestHandler)
    server.allow_reuse_address = True
    server.serve_forever()
登录后复制

PHP

?
$avro         = json_decode(file_get_contents('avro-protocol.json'), true);
?
$avroProtocol = new AvroProtocol();
$protocol     = $avroProtocol->real_parse($avro);
$schema       = AvroSchema::real_parse($avro['types'][0]);
?
$datum_writer = new AvroIODatumWriter($schema);
$write_io     = new AvroStringIO();
$encoder      = new AvroIOBinaryEncoder($write_io);
?
$message = array('url' => 'http://dmyz.org', 'charset' => 'utf-8');
$datum_writer->write($message, $encoder);
?
$content      = $write_io->string();
?
$headers = array(
    "POST / HTTP/1.1",
    "Host: " . self::$host,
    "Content-Type: avro/binary",
    "Content-Length: " . strlen($content),
);
?
$socket = stream_socket_client('localhost:9090', $errno, $errstr, 5);
?
if (!$socket)
    throw new Exception($errstr, $errno);
?
fwrite($socket, implode("\r\n", $headers) . "\r\n\r\n");
fwrite($socket, $content);
?
$result = '';
while (!feof($socket)) {
    $result .= fgets($socket);
}
fclose($socket);
?
return $result; #得到Python端返回的数据
登录后复制
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号