2013-03-05 42 views
3

我開始考慮將websockets作爲解決方案,以取代正在試運行的新版本PHP應用程序中的長輪詢。Websockets&PHP

我有幾個問題,我不知道人們能否幫助我。

  1. 一個Nodejs服務器可以調用PHP,如果它確實不會像剛剛通過Apache在連接方面遭受同樣的缺點?我們都知道nodejs是非阻塞的,Apache等不是,但是如果Nodejs只是在它自己的過程中調用PHP服務器,那麼這不會以類似的方式實現嗎?
  2. PHP和websockets是否匹配?
  3. 除了socketio之外,還有什麼好的js庫,它顯然只能和Nodejs一起使用?
  4. 有沒有人發現一個很好的教程,它使用websockets和PHP後端也許使用像棘輪PHP庫這可能會幫助我的方式嗎?

想法將不勝感激。

+1

Ratchet PHP很乾淨。我也正在[我自己的實現(包括演示)](https://github.com/PeeHaa/WebSocketDemo)。 – PeeHaa 2013-03-05 09:47:20

+0

@PeeHaa不錯的演示 – Baba 2013-03-05 11:01:54

+0

可能是有用的,包括演示應用程序,http://www.techzonemind。com/php-websocket-library-two-way-real-time-communication/ – 2014-05-07 15:49:14

回答

0
  1. 如果你經過apache,它會遇到同樣的瓶頸。這可以通過使用不同的Web服務器來解決,如lighthttpdnginx。根本不需要節點。
  2. PHP沒有像樣的共享內存使WebSockets無用的最大優點。它應該是體面足夠,如果你不希望互動用戶之間,但即使如此,我將不得不皺眉了PHP的使用。 PHP很適合很多事情,但實時通信不是其中之一。
  3. 你可能想看看https://github.com/einaros/ws
  4. PHP不是一個好的後端。與執行模型,任何不運行和忘記在自己的沙箱,如節點.NETC/C++的Java是精彩的比賽。 PHP適用於短期運行的執行,比如實際的網站甚至是web服務 - 但不是實時連接。
+0

我認爲總有一件事情是,如果前端通過PHP提供,那麼Nodejs支持的websocket如何與現有代碼庫交互它被安置在其他地方? – David 2013-03-05 10:07:56

+0

您可以將Web服務器配置爲使用WebSocket路由的反向代理並將其轉發給節點。節點不能使用PHP代碼,但可以調用用PHP編寫的服務,或者直接訪問持久存儲,而不是通過PHP。 – 2013-03-05 10:11:37

+3

PHP適用於實時通信,長時間運行的進程等等。僅僅因爲你沒有完成它們並不意味着語言不適合它。 – chugadie 2015-03-21 12:48:11

1

請原諒我解釋你的問題。

1:Node.js是否可以調用PHP,並且不會有與Apache相同的缺點?

調用一次運行的PHP腳本與調用網頁具有相同的一般缺點,除了要刪除額外的處理層。 Apache或任何Web服務器本身就是一個如此薄的一層,雖然你會節省一些時間,但節省將是微不足道的。

如果PHP爲您的客戶端收集的數據比Node.js更有效,無論出於何種原因,那麼在您的應用程序中包含PHP可能是明智的。

2:PHP和WebSockets是否匹配?

傳統的PHP腳本通常意在每次請求運行一次。絕大多數PHP開發人員不熟悉事件驅動的開發,而PHP本身還不支持異步處理。

PHP是一種快速,成熟的腳本語言,只是速度越來越快,即使所有它的許多缺點和不足之處。 (有人說,它的弱類型是一個缺點,有人說它的缺點是它的類型不夠弱)。

也就是說,任何語言實現WebSockets所需的最低限度是打開建立一個基本的TCP端口並監聽請求。對於PHP,它是作爲C套接字庫的一個簡單包裝實現的,並且還有其他擴展和框架可用,這些擴展和框架也可以改變使用PHP在TCP套接字中工作的感覺。

PHP的垃圾收集器也日趨成熟。內存泄漏來自於對內存空間的嚴重忽視(我在看你,Zend Framework),或者來自開發人員故意破壞垃圾收集系統的人,他們認爲他們很聰明或想證明它是多麼容易擊敗GC。 (擾流板:這很容易在每一種語言,如果你知道詳情)

這是很可能的,很容易建立一個守護進程(長時間運行的後臺進程)在PHP。甚至有可能使它正常運行,以便正常重啓並將其連接關閉到相同腳本的新版本,甚至可以在運行不同版本PHP的同一臺服務器上使用同一腳本,儘管這僅僅是一個範圍微小一點。

至於是否匹配,完全由開發商決定。您是否願意,能夠並樂意使用PHP來編寫WebSockets服務器,或者使用其中一臺現有的服務器?是?然後你是與PHP和WebSockets很好的匹配。

3:JS庫的的WebSockets

老實說,我還沒有研究它們。

4:教程使用PHP和WebSockets的

我個人喜歡這個教程:http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

雖然我有充分根據的是該教程的細節將很快過時了該特定的WebSockets服務器。 (目前仍是該服務器的積極維護原有分支,雖然)。

在鏈接腐爛的情況:

使用PHP-WebSockets的服務器(在Github上可用,不久將歸),延長基地WebSocketServer抽象類,並實現抽象方法process()connected(),並closed()

有在鏈路更好的信息上面,雖然如此,遵循它,只要存在鏈接。