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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
