请稍等...页面即将加载完成

PHP调用python服务接口

时间: 2011-06-15 / 分类: Python&Ruby, 我爱PHP / 浏览次数: 1,065 views / 0个评论 发表评论

      小秘书把人搞烦了,改需求,等接口。算了,休息一下,写段小程序。前端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,不多说,上代码:

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了。当然这只是一个最简单原型,可能有些问题没有考虑,需要大家指出在完善。

更多
订阅

发表评论

您的昵称 *

您的邮箱 *

您的网站


six - 2 =