2010-05-17 61 views
4

我需要爲我的應用程序編寫一些服務。我希望每個客戶端都有有限的持久連接(例如只允許前10個客戶端連接)。如何使用PHP製作服務器應用程序

我知道我可以用PHP通過socket_listen()在端口上收聽。父進程接受連接,然後pcntl_fork()進程讓子進程處理連接。

但據我所知,在fork()ed時,PHP資源不會持久。我想知道是否有可能用PHP來做到這一點,或者我必須在C中做到這一點?

+0

據我所知,問題是存儲所有分支所需數據的位置(例如連接數)? – Kirzilla 2010-05-17 09:52:09

回答

1

1) 爲什麼要分叉?將守護進程作爲單個進程運行,並使用socket_select()(或stream_select)來偵聽請求。

請參閱Aleksey Zapparov的代碼here以獲取現成的解決方案。

2) 爲什麼還要編寫自己的套接字代碼 - 使用[x] inetd來管理服務器並執行stdio上的通信(請注意,與解決方案1不同,每個套接字將有一個獨立的進程客戶端 - 因此處理代碼將是非阻塞的)

- 您說的正確的地方是PHP資源不應該在分叉進程中可用 - 但不會指出這與您當前的問題之間的關係。只是爲了讓您可以統計連接數量?或者是其他東西?在前者的情況下,這樣做有很多簡單的方法。使用解決方案1時,只需在客戶端連接/斷開連接時遞增和遞減計數器變量。在2的情況下,採用相同的方法,但將變量保存在數據文件/數據庫中(您可能還想存儲有關連接的信息並運行偶爾的審計)。或者限制防火牆上的連接。

C.

+0

我的問題是我有一個Online Judge系統。我想分發在多臺機器上運行的測試(以減少結果中的噪音,這可能會導致在邊緣時間運行的解決方案)。 守護進程是一個隊列管理器。它從數據庫中讀取是否有新的提交。因此,隊列管理器守護程序必須始終連接每個客戶端,以便爲每個客戶端分配解決方案,然後等待客戶端的結果。但是我需要併發性來節省結果,所以我考慮使用守護進程和分叉進程。使用我自己的套接字代碼,我也可以輕鬆地將它移植到Windows上。 – innocenat 2010-05-17 12:48:09

+0

你所描述的似乎是一個半同步的請求/回覆消息發佈系統 - 這是一個完全不同的水壺。當然,解決方案1仍然是可行的。我認爲「Windows」是指微軟的平臺之一 - 在這種情況下,解決方案2是相當深奧的。但1仍然有效。但是從您的有限說明中,大部分連接分配都應通過數據進行控制。 – symcbean 2010-05-17 14:04:09

+0

通過數據控制連接分配?是的,我的意思是Microsoft Windows。但解決方案之一,我不知道是否socket_select阻塞,我需要廣播消息... – innocenat 2010-05-18 04:15:06

0

也許你可以嘗試使用memcache共享它(http://www.php.net/manual/en/book.memcache.php)。 (我從來沒有嘗試過,可能會有效)

+0

-1沒有資源只在創建它們的過程中有效 - 理論上它們可以跨輕量級線程移植 - 但PHP不實現線程處理。 – symcbean 2010-05-17 11:21:10

+0

我的不好。即使使用shmop()? – 2010-05-17 13:30:05

相關問題