请稍等...页面即将加载完成
PHP调用python服务接口
小秘书把人搞烦了,改需求,等接口。算了,休息一下,写段小程序。前端php掉后端服务接口的应用对一个公司来说很正常,一般的解决方案都是使用中间件,我们公司一直使用的是ice,怎么样呢,蛮好,3.4蛮好,但还是有点麻烦,所以就有了下面这个东西了,如果只是做小测试或者写简单demo用这个是没有问题的,主要是快。
首先建个服务,最快方法,用python,不说了,来代码:
View Code PYTHON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import time import json import socket import traceback import threading import SocketServer class Too: def __init__(self): print 'Welcome!' def test(self, args): return 'xxx:%s' % args; def error(self, args): return 'not function!' class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): while True: try: data = self.request.recv(1024) if not data: print 'end' break data = json.read(data) res = getattr(self._object, data['func'], 'error')(data['args']) if not res: res = '' res = str(len(res)).rjust(8, '0')+str(res) self.request.send(res) except: print 'error in ThreadedTCPRequestHandler :%s, res:%s' % (traceback.format_exc(), data) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass class Server: def __init__(self, host, port): self.host = host self.port = port ThreadedTCPServer.allow_reuse_address = True def open(self, object): ThreadedTCPRequestHandler._object = object server = ThreadedTCPServer((self.host, self.port), ThreadedTCPRequestHandler) server.serve_forever() if __name__ == '__main__': Server('0.0.0.0', 12580).open(Too()) |
在写个前端脚本调用,还是最快原则,php,不多说,上代码:
View Code PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | class server{ private $_host; private $_port; private $_error; private $_socket; private $_class; function __construct($host, $port){ $this->_host = $host; $this->_port = $port; $this->_class = ''; $this->_connect(); } private function _connect(){ $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($sock===false){ $this->_error('error socket_create'.socket_strerror(socket_last_error())); } $ret = socket_connect($sock, $this->_host, $this->_port); if($ret===false){ $this->_error('error socket_connect'.socket_strerror(socket_last_error())); } $this->_socket = $sock; } public function object($class){ $this->_class = $class; return $this; } public function __call($func, $args){ $data = array('class' => $this->_class, 'func' => $func, 'args' => $args); $data = json_encode($data); $socket = $this->_socket; $res = socket_write($socket, $data, strlen($data)); if($res===false){ $this->_error('error socket_write'.socket_strerror(socket_last_error())); } $res = socket_read($socket, 1024, PHP_BINARY_READ); $result = substr($res, 8); $len = intval(substr($res, 0, 8)); while(true){ if($len != strlen($result)){ $result .= socket_read($socket, 1024, PHP_BINARY_READ); }else{ break; } } return $result; } private function _error($errMsg = ''){ $this->_error = $errMsg; echo $errMsg; exit(); } public function __destruct(){ $socket = $this->_socket; socket_write($socket, '', 0); //结束 socket_close($socket); } } function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $start = microtime_float(); $s = new server('192.168.0.254', 12580); $res1 = $s->object('Too')->test('a', 'b'); $res2 = $s->object('Too')->test('a', 'b'); $end = microtime_float(); echo $res1.$res2.'<br />'; echo 'cost:'.($end-$start);//速度在0.002秒左右 |
怎么样,好用不,你需要做的就是完成自己的接口类,如测试中的Too类,而php什么都不需要关心,只需要知道服务的地址和端口,及接口名和相应方法就ok了。当然这只是一个最简单原型,可能有些问题没有考虑,需要大家指出在完善。
上一篇: php使用HandlerSocket总结
下一篇: 易忽视的php错误【保持更新】
