2013-01-21 102 views
0

我需要發送數千個POST請求。 我搜索網絡上的信息,並多次嘗試後,我編碼 以下解決方案:用Python發送POST請求的正確方法(urllib2,base64和json)

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

推是字典列表。

大多數情況下,此解決方案都可以正常工作,但有時它會在目標服務器(Apache)上導致分段錯誤。我監視了目標服務器上打開的連接。 連接數量很少(100-200)。 也許我的代碼不是100%正確的。 我需要一個更可靠的解決方案。

在此先感謝。

更新 - 2013年1月25日
我用strace的調試Apache Web服務器(目標服務器)。
我發現Zend Framework使用的syscall'gettimeofday'存在一些問題。
我試圖將zend應用程序移到兩個不同的服務器上, Centos和Ubuntu Server 12.04。
PHP版本也從5.3更改爲5.4。
我總是遇到strace的問題。

我將應用程序移植到另一個框架。問題消失了。
執行POST請求的源服務器上的代碼未被修改。

+0

你見過[請求](http://docs.python-requests.org/en/latest/)嗎? –

+0

@AlexL:還沒有。我會試一試。謝謝。 – pedrotech

回答

1

如果你在Apache上有段錯誤,你爲什麼認爲這個問題與你的代碼有關?我要做的就是仔細觀察一下Apache發生的事情,當它死去時 - 打開調試日誌記錄,對其進程進行跟蹤/記錄,最後測試在使用其他http服務器(如Nginx或Lighttpd)時是否發生相同情況。 不知道爲什麼Apache會死,你甚至不能在代碼中嘗試修復你的問題(即使正確的解決方案是修復Apache)。

+0

在Apache上我得到這個錯誤: [Mon Jan 21 10:19:21 2013] [notice] child pid 19692 exit signal Segmentation fault(11)。 我已經試過Lighttpd了。使用Lighttpd我得到一個HTTP 500錯誤。 – pedrotech

+0

那麼,這是一個很好的開始調試:)繼續尋找問題 - 啓用更詳細的日誌記錄,不僅在Apache中,而且在任何處理該流量(某些PHP應用程序?Perl CGI?無論)中,strace/ktrace該過程並找出真正發生的事情。 – SpankMe

+0

在目標服務器上部署了一個Zend應用程序。 我的老闆也建議使用strace,但我真誠地想要避免它(我從來沒有用過它,我很懶)。最終我會記錄自己。 – pedrotech