php-thrift新项目部署中一个小问题的分享
之前某项目的一个,主要是他们用到了thrift这个扩展;
当时这个扩展在线上环境还没有大规模部署,于是把出现的一些问题总结分享给大家。
1.首先是下载源码,一开始就犯了个错误,把源码直接编译了,但是一般会报错,研究了很久也没解决,最后才发现,扩展方式安装只需要编译源码的一小部分。
cd /usr/local/thrift-0.8.0/lib/php/src/ext/thrift_protocol /usr/local/php5/bin/phpize ./configure --enable-thrift_protocol --with-php-config=/usr/local/php5/bin/php-config
检查/usr/local/php5/lib/php.ini 中是否包含:Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/和thrift_protocol.so
编辑php.ini加入extension=thrift_protocol.so,reload PHP即可。
写一个phpinfo可以看到一个标有版本1.0的thrift扩展模块。
2.之后遇到的一个问题就真的很让人郁闷。QA环境都是好好的一个项目,线上环境基本都配置好之后,研发跑来反映说网络不通。用ping,telnet,curl手动检查后端机器都正常,上机器查看日志发现,错误日志显示无法连接到后端接口,而这个部分正是调用thrift扩展。于是调大超时的设置,但是观察到几乎是鼠标点下按钮错误就出现了,不是后端超时造成。之后研发写了一个简单的调用thrift的页面,我们一直把注意力放在了一些路径的处理上,然后不断的修改和调试也没有发现根本原因。
最后,在线上和QA环境对比发现,有区别的基本只有PHP版本和代码的配置文件,QA环境的配置文件都是写死的IP,而线上为了推广标准化域名,用了这样的写法:
//dan server 'ServUrl' => 'Http://xxx.cn', 'ServPort' => '8080',
同样,另外一个接口也是这样的域名,在另一个兄弟的提醒下,我们把域名换为IP,错误消失,然后去掉域名前的http://,服务也是正常的。问题原因找到:Thrift本身定义了一些传输协议,并不能和http协议兼容,所以用http 1.1方式的调用因为协议不同会立刻产生错误。
网上找了个简介:Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。