用Python发送POST请求的正确方法(urllib2、base64和json)
我需要发送成千上万的POST请求。
我在网上查了很多资料,经过多次尝试,写出了以下的解决方案:
post_data = urllib.urlencode({'pushes': b64encode(json.dumps(pushes))})
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent,
'Content-type': "application/x-www-form-urlencoded",
'Accept': "text/plain"}
request = urllib2.Request(PUSH_URL, data=post_data, headers=headers)
response = urllib2.urlopen(request).read()
这里的pushes是一个字典的列表。
大多数情况下,这个解决方案运行得很好,但有时候会导致目标服务器(Apache)出现段错误。我监控了目标服务器上的连接情况,发现连接数量不高(100-200)。
可能我的代码并不是100%正确,我需要一个更可靠的解决方案。
提前谢谢大家。
更新 - 2013年1月25日
我使用strace来调试Apache网络服务器(目标服务器)。
我发现Zend框架使用的系统调用'gettimeofday'有一些问题。
我尝试把Zend应用程序移动到两个不同的服务器上,Centos和Ubuntu Server 12.04。
PHP版本也从5.3改成了5.4。
但使用strace时,我总是遇到同样的问题。
我把应用程序移植到另一个框架,问题就消失了。
负责发送POST请求的源服务器上的代码没有做任何修改。
1 个回答
1
如果你的Apache出现了段错误(segfault),你为什么认为问题出在你的代码上呢?我建议你仔细观察一下Apache在崩溃时发生了什么——可以开启调试日志,使用strace或ktrace来跟踪它的进程,最后还可以测试一下在使用其他HTTP服务器,比如Nginx或Lighttpd时是否也会出现同样的问题。
如果你不知道Apache崩溃的原因,就算想在你的代码里进行修复也没办法(即使正确的解决办法是修复Apache本身)。