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方式上安全的传输调用的内容
感觉是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方式上安全的传输调用的内容
相关文章推荐
- [Python]Python/PHP如何查询sql server中NTEXT类型数据
- 如何在阿里云上部署PHP后端
- [Python]Python/PHP如何查询sql server中NTEXT类型数据
- 如何利用vue和php做前后端分离开发?
- 关于php如何调用python最简单的例子
- [Python]Python/PHP如何查询sql server中NTEXT类型数据
- PHP和Python如何侵占了Perl如此大的份额
- 如何在php后端及时推送消息给客户端
- 如何利用vue和php做前后端分离开发
- 如何让PHP像python一样编程
- 如何在php后端及时推送消息给客户端
- 如何面试Python后端工程师?
- 6月29日云栖精选夜读:Java、PHP、Python、JS 等开发者都如何绘制统计图
- Java、PHP、Python、JS 等开发者都如何绘制统计图
- [Python]Python/PHP如何查询sql server中NTEXT类型数据
- 关于php前后端如何识别json格式小结
- 如何面试Python后端工程师
- Java、PHP、Python、JS 等开发者都如何绘制统计图
- 如何面试Python 后端工程师(持续更新)
- 如何通过表单上传图片数据,PHP后端获取并且保存文件数据