php调用python服务

系统 1624 0

php调用python服务

侃侃:公司用的php的popen以命令的形式调用python,首先说说这样做的缺点。
php执行命令行调用python的缺点
popen('python test.py [参数]', 'r');
缺点一:windows默认的是gbk编码,当php中传utf-8中文参数的时候,python接收到的参数会有问题。

当然,这是有解决的办法的,就是windows下转换一下字符的编码,linux不用转换。再来python接收参数的时候肯定也要转换编码了,烦不烦?

cmd命令或者shell命令是有长度限制的,传的参数过长的时候,接收到的参数就不会完整。
执行shell命令是有危险的,万一参数里面多了个啥,你知道的。

这也能解决,php中的函数escapeshellarg,嗯哼先给他escape一下。

那怎么办呢?
python socket server
不多说,不清楚的百度"socket",下面上代码(写的一个php调用python服务美化javascript的应用,服务器端python):

代码中引用的模块将会在附件中给出

import sys, json
import traceback
import SocketServer
from daemon import Daemon
import jsbeautifier

class Todo:

          
            def __init__(self):
    print('Welcome!')
def test(self, args):
    res = jsbeautifier.beautify(args[0].encode('utf-8'))
    return res;
def error(self, args):
    return 'not function!'

          
        

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

          
            def handle(self):
    while True:
        try:
            data = self.request.recv(2*1024*1024)
            if not data:
                print('end')
                break
            data = json.loads(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(Daemon):

          
            def conf(self, host, port, obj):
    self.host = host
    self.port = port
    self.obj = obj
    ThreadedTCPServer.allow_reuse_address = True
def run(self):
    ThreadedTCPRequestHandler._object = self.obj
    server = ThreadedTCPServer((self.host, self.port), ThreadedTCPRequestHandler)
    server.serve_forever()

          
        

if name == '__main__':

          
            server = Server('/tmp/daemon-tortoise.pid')
server.conf('0.0.0.0', 1990, Todo())
if len(sys.argv) == 2:
    if 'start' == sys.argv[1]:
        server.start()
    elif 'stop' == sys.argv[1]:
        server.stop()
    elif 'restart' == sys.argv[1]:
        server.restart()
    else:
        print("Unknown command")
        sys.exit(2)
    sys.exit(0)
else:
    print("usage: %s start|stop|restart" % sys.argv[0])
    sys.exit(2)
          
        

解释一下,上面这些代码是用python创建一个socket服务器,并且加入系统的守护进程。Todo里面实现策略工厂啥的,你懂的。使用方法:
python sever.py [start|stop|restart]

接着设为系统启动项就O了。

php通过socket调用python
//代码中引用的文件将会在附件中给出,附件中还给出了php并发的写法
header("Content-type: text/html; charset=utf-8");
require 'socketapi.php';
$s = new server('192.168.1.8', 1990);
$code = <<
/ 美化:格式化代码,使之容易阅读 /
/ 净化:去掉代码中多余的注释、换行、空格等 /
/ 压缩:将代码压缩为更小体积,便于传输 /
/ 解压:将压缩后的代码转换为人可以阅读的格式 /

/ 如果有用,请别忘了推荐给你的朋友: /
/ javascript在线美化、净化、压缩、解压:http://box.inote.cc/js /

/ 以下是演示代码 /

          
            var getPositionLite = function(el) {        var x = 0,        y = 0;        while (el) {            x += el.offsetLeft || 0;            y += el.offsetTop || 0;            el = el.offsetParent        }        return {            x: x,            y: y        }    };
          
        

/ 更新记录: /

          
            var history = {
    'v1.0':    ['2011-01-18','javascript工具上线']
};
          
        

EOT;
$res = $s->obj('Todo')->test($code);
echo '

          '.$res.'
        
';


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论