有什么区别 - 性能方面 - 从套接字读取1个字节一次到读取大块?
我有一个C++应用程序,需要从Web服务器提取页面并逐行解析收到的页面.目前,我一次读取1个字节,直到遇到CRLF或达到最大1024字节.
如果读取大块(例如一次1024个字节)在性能方面要好得多,那么关于如何实现我目前所拥有的相同行为的任何想法(即能够一次存储和处理1个html行 - 直到CRLF还没有消耗后续的字节)?
编辑:
我买不起太大的缓冲区.由于应用程序用于嵌入式设备,因此我的代码预算非常紧张.我更喜欢只保留一个固定大小的缓冲区,最好一次只保留一个html行.这使我的解析和其他处理变得容易,因为我随时尝试访问缓冲区进行解析,我可以假设我正在处理一个完整的html行.
谢谢.
我正在寻找用C和CGI编写一些应用程序,现在我已经实现了URI编码/解码,HTML实体编码/解码,查询/ cookie解析器等基本功能.我需要管理会话.我该怎么做?例如,PHP如何管理会话?
我有一个apache服务器,我正在设置它fcgi.我正在考虑是否要设置量身定制的mod_fastcgi或普通的旧款cgi-fcgi.
mod-fastcgi似乎不支持"多路复用"功能fcgi,我正在构建的Web服务是一个非常高的流量服务,每分钟有几千个呼叫,我希望它们尽快处理.
任何建议或意见??
我希望能够调用已经运行的Java jar中包含的某些方法(确保它将运行).我找到了像Jython这样的东西,但那些似乎只能访问Java的本机类等.
有没有办法阻止 lighttpd 将 POST 缓冲到 CGI 可执行文件?
在我看来,所有请求在转发到 CGI 可执行文件之前都已完全缓冲在磁盘上,这使我无法以基于流的方式处理输入。
澄清一下,我只是在谈论转发到标准输入上的 CGI 可执行文件的请求;我已经验证了响应没有像那样缓冲,并且流输出确实是可能的。
对于HTML5和Python CGI:
如果我写UTF-8元标记,我的代码不起作用.如果我不写,它就有效.
页面编码是UTF-8.
print("Content-type:text/html")
print()
print("""
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
?ö??çü
</body>
</html>
""")
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.
print("Content-type:text/html")
print()
print("""
<!doctype html>
<html>
<head></head>
<body>
?ö??çü
</body>
</html>
""")
Run Code Online (Sandbox Code Playgroud)
但这个代码有效.
我正在尝试通过 IIS 将 Flask 作为简单的 CGI 应用程序运行。
我有以下代码:
from wsgiref.handlers import CGIHandler
from flask import Flask
app = Flask(__name__)
@app.route('/')
def main():
return 'Woo woo!'
CGIHandler().run(app)
Run Code Online (Sandbox Code Playgroud)
我在 Windows 上运行 Python 3.3。我收到以下错误:
File "C:\Python33\lib\wsgiref\handlers.py",
line 509, in __init__(self, sys.stdin.buffer, sys.stdout.buffer, sys.stderr, )
AttributeError: 'NoneType' object has no attribute 'buffer' ".
Run Code Online (Sandbox Code Playgroud)
我添加了一些日志代码,事实证明sys.stdin是None.
Python 作为 CGI 处理程序添加到 IIS 中,如下所示:
Request path: *.py
Executable: C:\Windows\py.exe -3 %s %s
Run Code Online (Sandbox Code Playgroud)
那么,为什么 sys.stdin None 以及如何修复它?
编辑
看起来 sys.stdin 是 None 因为文件描述符无效。
我有以下用于 CGI 处理 HTTP 服务器的最小代码,这些代码源自内管上的几个示例:
#!/usr/bin/env python
import BaseHTTPServer
import CGIHTTPServer
import cgitb;
cgitb.enable() # Error reporting
server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler
server_address = ("", 8000)
handler.cgi_directories = [""]
httpd = server(server_address, handler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)
然而,当我执行脚本并尝试使用 CGI 在同一目录中运行测试脚本时http://localhost:8000/test.py,我看到的是脚本的文本,而不是执行的结果。
权限都设置正确,测试脚本本身不是问题(因为python -m CGIHTTPServer当脚本驻留在 cgi-bin 中时,我可以使用 运行它)。我怀疑这个问题与默认的 CGI 目录有关。
我怎样才能让脚本执行?
我正在使用 Python 和 CGI 编写一个小型网站,用户可以在其中上传 zip 文件和下载其他用户上传的文件。目前,我可以正确上传 zip 文件,但是在将文件正确发送给用户时遇到了一些麻烦。我的第一种方法是:
file = open('../../data/code/' + filename + '.zip','rb')
print("Content-type: application/octet-stream")
print("Content-Disposition: filename=%s.zip" %(filename))
print(file.read())
file.close()
Run Code Online (Sandbox Code Playgroud)
但很快我意识到我必须将文件作为二进制发送,所以我尝试:
print("Content-type: application/octet-stream")
print("Content-Disposition: filename=%s.zip" %(filename))
print('Content-transfer-encoding: base64\r')
print( base64.b64encode(file.read()).decode(encoding='UTF-8') )
Run Code Online (Sandbox Code Playgroud)
以及它的不同变体。它只是行不通;Apache 引发“来自脚本的格式错误的标头”错误,所以我想我应该以其他方式对文件进行编码。
我是新手,所以我看了一些教程。我有一个 python 脚本作为first.py
#!/usr/bin/python3
print "Content-type: text/html\n"
print "Hello, world!"
我的电脑上有多个版本的 python。我无法找出启用 cgi 的目录,因此我将此代码粘贴到三个位置
/usr/lib/cgi-bin/first.py
/usr/lib/cups/cgi-bin/first.py
/var/www/html/first.py
现在,当我在终端中运行此代码时,它工作正常,但是当我输入时
curl http://localhost/first.py
它只输出简单的文本并且不执行。
我已将所有权限授予first.py
我已通过命令启用并启动服务器
a2enmod cgi
systemctl restart apache2
请告诉我如何执行以及这里发生了什么?提前致谢。