我在python上編寫了一個監視fastcgi應用程序的工具。我需要從fastcgi中唯一需要加載ping和狀態頁面(如果失敗返回某種錯誤)。Python fastcgi客戶端
有很多庫(從python-fasctgi綁定到扭曲)似乎有這個能力,但他們中的大多數只是爲了我的目的矯枉過正,而且他們中的許多人會潛入我額外的依賴關係,導致一些包裝問題。
那麼,是否有任何簡單的python fastcgi 客戶端這些實現/庫易於安裝/打包(到rpm)或足夠小以便與項目一起分發。
UPDATE:
感謝AGF,我已經能夠連接到FastCGI的應用程序,併發送某種請求它。它不過是標準的php-fpm。但我無法獲得任何位置的響應:我正在嘗試從'/ ping',它應該以200 OK和'pong'作爲響應。我所得到的是200 OK響應與任何我的請求空身體。
我做這樣的要求:
def _load_page(self, url):
""" load fastcgi page """
fcgi = fcgi_client.FCGIApp(host = self.fcgi_host, port = self.fcgi_port)
env = {
'SCRIPT_FILENAME': url,
'QUERY_STRING': url,
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': url,
'REQUEST_URI': url,
'GATEWAY_INTERFACE': 'CGI/1.1',
'SERVER_SOFTWARE': 'ztc',
'REDIRECT_STATUS': '200',
'CONTENT_TYPE': '',
'CONTENT_LENGTH': '0',
'DOCUMENT_URI': url,
'DOCUMENT_ROOT': '/',
#'SERVER_PROTOCOL' : ???
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '123',
'SERVER_ADDR': self.fcgi_host,
'SERVER_PORT': str(self.fcgi_port),
'SERVER_NAME': self.fcgi_host
}
ret = fcgi(env)
print ret
我也不得不修改flup客戶在標準輸入處理:
# Transfer wsgi.input to FCGI_STDIN
content_length = int(environ.get('CONTENT_LENGTH') or 0)
s = ''
while True:
chunk_size = min(content_length, 4096)
#s = environ['wsgi.input'].read(chunk_size)
content_length -= len(s)
rec = Record(FCGI_STDIN, requestId)
rec.contentData = s
rec.contentLength = len(s)
rec.write(sock)
if not s: break
注意補充s=''
代替s = environ['wsgi.input'].read(chunk_size)
,這是部分與flup相關的一些wsgi相關的東西。所以它應該發送空標準輸入。
此外,我修改了flup到return status, headers, result
。
我檢查了響應閱讀代碼,它似乎很好:從fpm真的有空的身體。我使用wireshard來檢查網絡通信,對我來說這似乎很好 - 所有參數都在傳輸中。
任何想法?
UPDATE:
的問題是FastCGI的PARAM過濾功能:它過濾掉了很多有用的PARAMS像DOCUMENT_ROOT,SCRIPT_FILENAME等等。禁用此功能後,一切正常。
任何有興趣,這裏是修改的客戶機:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py,這裏是使用例如:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py
嗯,更改一些代碼後(註釋的標準輸入處理)我能夠連接到fastcgi服務器,但無法得到答案 - 它總是返回200與空身體出於某種原因。任何想法爲什麼? – rvs
在我看來,stdin處理是將輸入傳遞給FCGI服務器的原因,因此如果您已經發表了評論,那麼您可能會發送一個空請求。 – agf
我其實沒有評論,但只是發送空的標準輸入。如果我理解正確(從fascgi協議文檔和php-fpm源代碼),stdin僅用於傳遞發佈數據,所有其他信息都通過params傳遞。請更詳細地編輯問題。 – rvs