2012-09-07 46 views
0

我想寫一個網絡服務器。我不想爲php編寫模塊,所以我想我會傳遞信息到php-fpm,比如nginx和apache。我做了一些研究,並設置爲原型,但無法使其工作。如何將信息從cli或服務器傳遞到fastcgi(php-fpm)並返回?

我已經建立了一個php服務,監聽端口9999,在每個連接上都會打印print_r($ GLOBALS)。我設置了nginx將php請求傳遞給127.0.0.1:9999。請求被傳遞,但只有argc(1)和argv(php服務的路徑)以及$ _SERVER變量被填充。 $ _SERVER vars有很多關於php進程正在執行的當前環境的信息,但是我沒有看到有關連接用戶或其請求的任何信息 - 沒有REMOTE_ADDR,沒有QUERY_STRING,也沒有任何信息...

我很難找到如何將這些信息從cli或從原型服務器傳遞到fastcgi php進程的文檔。我已經找到了一些舊的CGI變量的列表,但沒有關於如何通過它們的信息,或者它們中的任何一個與fastcgi過時有關。

因此,我再次問你如何從你的服務器原型或cli傳遞信息到一個php-fpm或fastcgi過程 - 或者,我可以在這個主題上找到適當的,清晰明確的文檔? (並且不,RFC不是答案)。我在fastcgi.com和維基百科以及衆多其他搜索結果齋讀書...

===更新===

我已經得到了一個工作FastCGI的「服務」起來通過php中的原型運行。它在9999上偵聽,解析來自cli甚至來自nginx的二進制fcgi請求,它格式化一個二進制fcgi響應,通過網絡發送它,並且cli顯示它正常,並且nginx甚至將解碼後的fcgi響應返回給瀏覽器就像大自然的意圖。

現在,當我嘗試以其他方式做事情 - 寫我的原型服務器,形成一個二進制fcgi數據包,並將其發送到PHP-FPM,我沒有什麼 - 沒有錯誤輸出在cli或從錯誤日誌(我不能以任何方式將php-fpm寫入錯誤日誌[-_-])。所以,爲什麼不會給我一些迴應,無論是在錯誤文本,或二進制網絡數據包,或任何東西?我可以將數據從cli發送到fastcgi,但是我不能得到任何迴應,除非它是我自己的fastcgi過程(並且不,我沒有接管php-fpm的端口-i'm在9999年和9000年)。

=============

TIA \米/(> _ <)\米/

回答

0

得到它。

服務器將信息以網絡數據包的形式傳遞給fastcgi進程。非常類似於dns數據包,您必須使用您的語言的各個二進制字符處理函數來制定packate(包括頭文件和有效負載信息),然後通過管道/網絡將其發送到fastcgi服務器,fastcgi服務器然後將解析二進制數據包成爲迴應。有趣的東西 - 可以有更好的文件記錄,嗯: - \

哦,如果你原型的聽衆在PHP中,你不能通過任何PHP變量訪問這個數據包,你實際上必須讀取連接,重新監聽(因爲它是一個二進制網絡數據包,而不是純文本「發佈」數據)。

我已經設法通過php中的原型來運行fastcgi「服務」。它在9999上偵聽,解析來自cli甚至來自nginx的二進制fcgi請求,它格式化一個二進制fcgi響應,通過網絡發送它,並且cli顯示它正常,並且nginx甚至將解碼後的fcgi響應返回給瀏覽器就像大自然的意圖。

相關問題