您的位置:首页 > 编程语言 > Python开发

python如何为php写后端?

2013-02-02 21:05 197 查看
听到这样一种说法:PHP做前端,python做后端。
感觉是PHP写控制器,python写Model层。
在google上搜了半天也没有个答案。
有人说用python写接口,PHP调用。怎么个实现法呢?还望高手指点一下。

评论 (1)
• 分享

• 链接
• 2011-08-30 

1

是否是PHP访问Python写的Service?
黄新颖
2011-09-09

5个答案

票 数



程序员1999

1 票



7030

最佳答案

PHP做前端,PYTHON做后端,为啥要这么做呢,没感觉有什么优点。

以下是找来的一段示例,原作者为:http://www.quou.cn/archives/673,用socket连接。

PYTHON代码:

import time

import json

import socket

import traceback

import threading

importSocketServer

classToo:

def __init__(self):

print'Welcome!'

def test(self, args):

return'xxx:%s'% args;

def error(self, args):

return'not function!'

classThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

def handle(self):

whileTrue:

try:

data =self.request.recv(1024)

ifnot data:

print'end'

break

data = json.read(data)

res = getattr(self._object, data['func'],'error')(data['args'])

ifnot 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)

classThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer):

pass

classServer:

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',10009).open(Too())

PHP代码:

<?php

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();

}

privatefunction _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;

}

publicfunctionobject($class){

$this->_class = $class;

return $this;

}

publicfunction __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;

}

privatefunction _error($errMsg =''){

$this->_error = $errMsg;

echo $errMsg;

exit();

}

publicfunction __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('127.0.0.1',10009);

$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) • 链接 • 2011-09-16

理工小强

2 票



647

个人感觉没有必要这么复杂,你可以写个HTTP的API就能实
现对应的功能,当然可以考虑使用远程调用的样子,但是没有你想的那么复杂,你去看下PHPRPC这个开源工程【别被名称迷惑了,也包含
Python,Ruby,Java等多个版本】,是一个简化的远程调用项目,比XML方便多了,我一直在用这个工程做“C/S“结构的站点:
官方地址: http://www.phprpc.org
服务器端可以使用任意语言,比如这里的Python

from phprpc import PHPRPC_Server # 引入 PHPRPC Server

import datetime

def helloworld():

return'helloworld'

def hi(name):

return'hi %s'% name

server = PHPRPC_Server()

server.add(helloworld)

server.add('hi')

server.add(hi,'hello')

server.add(datetime.datetime.now)

server.debug =True

server.start()

客户端可以使用任意语言,比如Python和你说的PHP的

from flup.middleware.session importMemorySessionStore,SessionMiddleware

from flup.middleware.gzip importGzipMiddleware

from phprpc import PHPRPC_WSGIApplication,UrlMapMiddleware, PHPRPC_Server

import datetime

def helloworld():

return'helloworld'

def hi(name):

return'hi %s'% name

app = PHPRPC_WSGIApplication()

app.add(helloworld)

app.add('hi')

app.add(hi,'hello')

app.add(datetime.datetime.now)

app.debug =True

app =UrlMapMiddleware([('/', app)])

sessionStore =MemorySessionStore()

app =SessionMiddleware(sessionStore, app)

app =GzipMiddleware(app)

PHPRPC_Server(app = app).start()

下面的是PHP的内容:

<?php

include ("php/phprpc_client.php");

$client =new PHPRPC_Client();

$client->setProxy(NULL);

$client->useService('http://127.0.0.1/server.php');

$client->setKeyLength(1000);

$client->setEncryptMode(3);

$client->setCharset('UTF-8');

$client->setTimeout(10);

echo $client->hi('PHPRPC'),"\r\n";

echo $client->getKeyLength(),"\r\n";

echo $client->getEncryptMode(),"\r\n";

echo $client->getCharset(),"\r\n";

echo $client->getTimeout(),"\r\n";

?>

试试这个工程吧,还支持默认的自动对称加密协商,保证在不安全的HTTP方式上安全的传输调用的内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: