2012-03-16 61 views
4

我想開始使用websockets連接到一個PHP套接字服務器。這個服務器應該以特定的時間間隔檢查數據庫中是否發生了變化,然後應該將更改發送回客戶端。所以當客戶端連接時,只要客戶端(在這種情況下是網頁瀏覽器)在頁面上,連接應該保持打開狀態。PHP服務器和websockets

然後,服務器應該在一定的時間間隔檢查數據庫並在需要時發回數據。我知道問題不在於websockets(除了並非所有主流瀏覽器都支持它)。主要是我關心的是PHP。我想用PHP創建服務器,但是我可以保持一個連接打開PHP代碼,只要我想要?

而間隔如何。通常在C#.NET EXE應用程序中,我只需創建一個計時器。這怎麼能在PHP中完成?

如果這是所有可能的,我可以只是簡單地運行我的PHP代碼在Apache網絡服務器?

+0

websocket是一個不同的協議,所以沒有你不能通過Apache運行它。顯然有https://github.com/disconnect/apache-websocket – miki 2012-03-16 15:29:48

回答

5

通常,如果您要在PHP中編寫套接字服務器,則需要通過命令行運行套接字服務器。您需要考慮的事項如下:

您需要訪問套接字,通常您不需要訪問共享服務器,因此您必須去獲取VPS。

您希望在服務器上設置一個文件,每次重新啓動服務器時都會自動啓動您的PHP腳本。通常這是通過在/etc/init.d中放置一個運行PHP腳本的shell腳本,然後在/etc/rc5.d中的shell腳本中放置一個符號鏈接來實現的(假設這是您的默認級別)。

除非您還計劃將此服務器用作文件服務器,否則您很可能不希望/不需要Apache運行。如果您僅將它用於套接字服務器,則您需要安裝PHP-CLI。這會節省你的記憶。

如果您試圖在連接到服務器的用戶之間進行實時交互,則根本不需要涉及數據庫。您的套接字服務器將擁有連接到套接字服務器的所有訂戶的列表,因此當其中一個用戶向您發送消息時,您可以立即將該消息發回給所有連接的訂戶,而不會在慢速數據庫中存儲任何內容。或者,如果您能負擔得起,您可能需要將信息保存在內存中。

對於所有名爲socket.io的瀏覽器都不支持套接字的解決方案。基本上我相信如果它支持,它會嘗試設置一個瀏覽器websocket,但如果它不被支持,它會啓動一個Flash套接字連接。無論哪種方式,您都可以使用相同的界面與其進行交互。

您也可能想要考慮另一種語言來創建您的套接字服務器。 PHP並不是真正爲這種類型構建的。使用更好的語言是Javascript,特別是如果可擴展性是一個問題。 Node.js是一個庫,可以讓你很容易地構建套接字服務器,並且可擴展性更高。

+0

在我的情況下,數據庫是必須的。我沒有將所有內容都存儲在數據庫中,只是一些設置。當一個用戶更改設置時,則必須儘快通知其他用戶。所以當我需要一個數據庫時,我不認爲nodejs是我的選擇。但是在命令行中運行php服務器聽起來對我來說已經足夠了。我現在來看看 – w00 2012-03-16 15:55:35

+0

node.js內置了MySql和Drizzle驅動程序的數據庫訪問。如果必須立即通知其他用戶,爲何將其存儲在數據庫中?爲什麼不在一個用戶向您發送消息時立即將該信息發送給其他用戶?套接字服務器不像Web腳本。有一個腳本運行的實例,所有連接的用戶都在使用它。這意味着用戶可以共享變量內的數據,即時傳遞其他消息等。 – dqhendricks 2012-03-16 16:16:56

+0

http://nodejsdb.org/ – dqhendricks 2012-03-16 16:18:49