Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49969
  • 博文数量: 8
  • 博客积分: 178
  • 博客等级: 入伍新兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-14 14:07
文章分类
文章存档

2012年(8)

我的朋友
最近访客

分类: Python/Ruby

2012-02-14 14:38:17

hp的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):

  1. import sys, json
  2. import traceback
  3. import SocketServer
  4. from daemon import Daemon
  5. import jsbeautifier

  6. class Todo:
  7.     def __init__(self):
  8.         print('Welcome!')
  9.     def test(self, args):
  10.         res = jsbeautifier.beautify(args[0].encode('utf-8'))
  11.         return res;
  12.     def error(self, args):
  13.         return 'not function!'

  14. class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
  15.     def handle(self):
  16.         while True:
  17.             try:
  18.                 data = self.request.recv(2*1024*1024)
  19.                 if not data:
  20.                     print('end')
  21.                     break
  22.                 data = json.loads(data)
  23.                 res = getattr(self._object, data['func'], 'error')(data['args'])
  24.                 if not res:
  25.                     res = ''
  26.                 res = str(len(res)).rjust(8, '0') + str(res)
  27.                 self.request.send(res)
  28.             except:
  29.                 print('error in ThreadedTCPRequestHandler :%s, res:%s' % (traceback.format_exc(), data))

  30. class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
  31.     pass

  32. class Server(Daemon):
  33.     def conf(self, host, port, obj):
  34.         self.host = host
  35.         self.port = port
  36.         self.obj = obj
  37.         ThreadedTCPServer.allow_reuse_address = True
  38.     def run(self):
  39.         ThreadedTCPRequestHandler._object = self.obj
  40.         server = ThreadedTCPServer((self.host, self.port), ThreadedTCPRequestHandler)
  41.         server.serve_forever()

  42. if __name__ == '__main__':
  43.     server = Server('/tmp/daemon-tortoise.pid')
  44.     server.conf('0.0.0.0', 1990, Todo())
  45.     if len(sys.argv) == 2:
  46.         if 'start' == sys.argv[1]:
  47.             server.start()
  48.         elif 'stop' == sys.argv[1]:
  49.             server.stop()
  50.         elif 'restart' == sys.argv[1]:
  51.             server.restart()
  52.         else:
  53.             print("Unknown command")
  54.             sys.exit(2)
  55.         sys.exit(0)
  56.     else:
  57.         print("usage: %s start|stop|restart" % sys.argv[0])
  58.         sys.exit(2)

解释一下,上面这些代码是用python创建一个socket服务器,并且加入系统的守护进程。Todo里面实现策略工厂啥的,你懂的。使用方法:
python sever.py [start|stop|restart]
#接着设为系统启动项就O了。
php通过socket调用python
  1. //代码中引用的文件将会在附件中给出,附件中还给出了php并发的写法
  2. header("Content-type: text/html; charset=utf-8");
  3. require 'socketapi.php';
  4. $s = new server('192.168.1.8', 1990);
  5. $code = <<<EOT
  6. /* 美化:格式化代码,使之容易阅读            */
  7. /* 净化:去掉代码中多余的注释、换行、空格等    */
  8. /* 压缩:将代码压缩为更小体积,便于传输        */
  9. /* 解压:将压缩后的代码转换为人可以阅读的格式    */

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

  12. /* 以下是演示代码                */

  13.     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 } };
  14. /* 更新记录:                    */
  15.     var history = {
  16.         'v1.0':    ['2011-01-18','javascript工具上线']
  17.     };
  18. EOT;
  19. $res = $s->obj('Todo')->test($code);
  20. echo '
    '.$res.'
    '
    ;
转自: 
阅读(3234) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~