2012-04-25 186 views
6

我會盡量讓我的第一篇文章儘可能有趣。PHP中沒有守護進程的WebSocket服務器?

最近我對處理共享託管服務器上的WebSocket請求的可行性感興趣。

請不要告訴我「升級您的計劃」。所有這些在至少一個VPS上都是微不足道的。我意識到這一點。

正如很多人都知道,共享主機會...

  • 殺死守護程序,如果他們看到服務器的插槽裏
  • 塊使用
  • 拒絕你shell訪問
  • 保持apache和關閉的限制(無模塊安裝)

這些限制完全消除了phpwebsocket,python。需要僞裝成網頁的無後臺程序解決方案。

PHP是我最喜歡的服務器端語言,我製作了一個PHP websocket網關作爲網頁。

到目前爲止,我已經成功地爲握手和流輸出(使用輸出緩衝)發送正確的頭文件,但是我仍然無法弄清楚在初始請求後如何繼續讀取數據。

簡而言之,即使在PHP腳本啓動後,我仍想繼續從客戶端接收數據。我已經嘗試閱讀php://輸入pseudofile,但我似乎無法在GET結束後再讀取它。有沒有任何設置或黑客可以做到這一點?

謝謝!

+0

如果你沒有一個守護進程,什麼會處理websocket上的流量?這聽起來像最好的沮喪祕訣...... – sarnold 2012-04-25 01:39:11

+0

Apache是​​守護進程。當websocket連接進來時它會調用我的php腳本。 – user1354999 2012-04-25 01:55:41

+0

Apache會很樂意收穫花費太長時間執行的腳本;你可以在三到五分鐘左右工作嗎? – sarnold 2012-04-25 01:56:40

回答

0

WebSocket握手完成後,它的工作原理與普通套接字非常相似。沒有理由爲什麼Apache會允許沒有標題的單向通信。

0

你的問題在這裏是Apache本身。一旦Apache讀取了第一個HTTP請求(websocket握手),它將繼續從TCP連接讀取任何其他HTTP請求。因此,TCP連接上發送的任何新數據將永遠不會傳遞給您的腳本。這是必要的,因爲HTTP/1.1協議默認支持Keep-Alive,這意味着在一個TCP連接上完成多個請求/響應循環。瀏覽器不會爲每個請求打開HTTP連接(這是HTTP/1.0中的默認設置)。你不能改變這種行爲。要實現websocket服務器,您需要設置自己的套接字。

5

簡短版本:你試圖做的事情根本不可能。

長版本:你可以得到的最好的是一個單向通信通道,看起來像在你的瀏覽器中的websocket連接,但只能在一個方向上工作。從服務器到瀏覽器。另一個方向將無法正常工作,因爲Web服務器不知道您正在嘗試使用與HTTP不同的協議,並且無法告訴它。至少不是你剛剛列出的情況。