Chinaunix

标题: 有没有简单的让python的web服务器运行PHP脚本的方法 [打印本页]

作者: 盖茨他爹    时间: 2010-03-19 14:17
标题: 有没有简单的让python的web服务器运行PHP脚本的方法
我知道用python实现一个web服务器非常简单,只需要简短的几行代码,就可以开发出支持HTML静态网页的web服务器,再多加几行代码,就可以以CGI的模式运行python脚本,从而开发动态网站。

那么python有没有简单的方法去支持PHP呢?CGI模式或ISAPI模式都可以,只要让它能运行PHP,哪位大侠可以提供一个最原始的demo吗,在下不胜感激。


我想实现一种在个人PC上解压即可运行的网站系统或者WEB软件,用py2exe打包web.py或Django框架下开发的网站很容易实现,但毕竟python开发的web应用不如PHP多(在国内),所以我想用python实现服务器部分,网站程序用PHP,然后打包,让用户在电脑上解压即可运行网站。虽然已经有PHPNOW等软件可以让部署PHP环境非常简单,但我认为还不够傻瓜化,我想用python做一个更简单的,让用户感觉不到PHP、PYTHON等技术的存在,解压后即可使用
作者: luffy.deng    时间: 2010-03-19 15:06
本帖最后由 luffy.deng 于 2010-03-19 15:08 编辑

你是用Python写web应用 还是用"python实现一个web服务器"?理论上如果你在你的webserver里实现了cgi协议 可以以cgi的方式运行python  那么不需要多余的工作就可以用php,cgi是语言无关的。
作者: 盖茨他爹    时间: 2010-03-19 15:22
是用"python实现一个web服务器"

这里有简单的支持cgi的方法 http://www.lpfrx.com/archives/133/

py脚本好像是在代码顶部调用的解释器
#!c:/Python24/python.exe

print "HTTP/1.0 200 OK"
print "Content-Type: text/html"
print ""
print "<p>"
print "Hello World!"
print "</p>"
PHP脚本也得在顶部调用解释器才可以吗?如果这样就必须得把PHP解释器放在固定位置了,没法随处解压了
作者: luffy.deng    时间: 2010-03-19 16:47
#!c:/Python24/python.exe
这个对win32不起作用
作者: 盖茨他爹    时间: 2010-03-19 17:14
下面的脚本运行我在3楼写的CGI脚本就可以
  1. from CGIHTTPServer import CGIHTTPRequestHandler  
  2. from BaseHTTPServer import HTTPServer     
  3. server_address=('',7777)  
  4. httpd = HTTPServer(server_address, CGIHTTPRequestHandler)  
  5. httpd.serve_forever()
复制代码
运行PHP脚本就不可以,请问PHP的解释器在哪里加载呢

代码摘自http://www.lpfrx.com/archives/133/ 里面的 web3.py
作者: luffy.deng    时间: 2010-03-19 17:17
win32下你只需要做文件关联就可以了。#!  只对shell起作用。
作者: 盖茨他爹    时间: 2010-03-19 18:10
在这个简单的web服务器中怎么关联php.exe啊,请大侠赐教
  1. from CGIHTTPServer import CGIHTTPRequestHandler  
  2. from BaseHTTPServer import HTTPServer     
  3. server_address=('',7777)  
  4. httpd = HTTPServer(server_address, CGIHTTPRequestHandler)  
  5. httpd.serve_forever()
复制代码

作者: luffy.deng    时间: 2010-03-19 23:38
本帖最后由 luffy.deng 于 2010-03-20 08:40 编辑

非常不幸  CGIHTTPRequestHandler  的run_cgi方法对非python文件要判断是否可执行,判断的方法是
st.st_mode & 0111 != 0    在win32下所有的  .php文件计算结果都是False。你可以到linux下试一下。
作者: luffy.deng    时间: 2010-03-20 12:24
本帖最后由 luffy.deng 于 2010-03-20 12:29 编辑

可以对CGIHTTPServer稍加修改使用php,附件里mCGIHTTPServer是我改过的在284行我把php解析器路径写死了,这个你可以自己改一下 ,使用环境变量或者解析.php文件的第一行#!指示符后面内容。
  1.             if self.is_php(scriptfile):
  2.                 interp = "d:\\php\\php.exe"
  3.                 cmdline = "%s  %s" % (interp, cmdline)
复制代码
经测试可以使用,cgiserver是这样的
  1. from mCGIHTTPServer import CGIHTTPRequestHandler  
  2. from BaseHTTPServer import HTTPServer     
  3. server_address=('',7777)  
  4. httpd = HTTPServer(server_address, CGIHTTPRequestHandler)  
  5. httpd.serve_forever()
复制代码
使用的php文件
  1. <html>
  2. <head>
  3. <title>First program</title>
  4. </head>
  5. <body>
  6. <?php
  7.   echo "hello, world\n";
  8. ?>
  9. </body>
  10. </html>
复制代码
在浏览器地址栏输入http://localhost:7777/cgi-bin/hello.php可以hello, world.

mCGIHTTPServer.7z

3.98 KB, 下载次数: 66


作者: 盖茨他爹    时间: 2010-03-20 12:29
谢谢luffy.deng朋友不厌其烦的帮助,我想出来一个方法了:

用os.popen运行php.exe,然后捕获输出的内容
  1. import os
  2. str = os.popen("php.exe test.php").read()
  3. print str
复制代码
只是不知道这样的效率如何,我再多测试测试吧
作者: luffy.deng    时间: 2010-03-20 12:33
谢谢luffy.deng朋友不厌其烦的帮助,我想出来一个方法了:

用os.popen运行php.exe,然后捕获输出的内容只 ...
盖茨他爹 发表于 2010-03-20 12:29


这样怎么实现cgi么?另外CGIHTTPServer里使用的是popen3.
作者: 盖茨他爹    时间: 2010-03-20 12:33
回复 9# luffy.deng


    刚看到编辑后的帖子,太感谢了{:3_189:}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2