簡體   English   中英

PHP套接字服務器問題(mysql連接,最大連接數限制)

[英]PHP socket server issues (mysql connection, max connections limit)

我需要編寫一個套接字服務器,它將至少處理大約1000個(將來會有更多)低流量的永久連接。 我已經出於測試目的在PHP上草擬了一個版本(我們正在開發監視硬件,因此我們需要開發和測試會話協議和硬件功能),當我只有幾個客戶端連接時,這非常適合我。 但是,當連接數量增加到十個時,出現了一些關鍵問題。 以下是有關服務器體系結構的一些信息:

我有一個主進程,它等待套接字連接,並在連接時使用pcntl_fork()創建一個子進程(從現在開始為該連接提供服務)。 我也在主進程中建立與MySQL的PDO連接。 所有子進程都共享相同的單個PDO對象。 起初,我擔心在同時進行查詢時會遇到一些沖突,但是即使通過壓力測試,我也沒有遇到它們(10個孩子在循環中進行查詢而不停止)。 但是每個孩子都有usleep(500000),所以運氣不錯,盡管我已經進行了幾個小時的測試。 但是,即使在連接的1k客戶端上也不會出現這樣的負載,這是因為它們與服務器之間的對話很少。

所以這是我的第一個問題 :對於大量子進程(理想情況下大約有1000個子進程)使用單個PDO對象是否安全? 我可以為每個孩子使用單個連接,但是MySQL不支持那么多連接。

第二個問題是獲取寄生MySQL連接。 如前所述,我只有一個PDO對象。 但是,當我連接了多個客戶端,並且在它們運行了一些查詢之后,我在mytop中看到存在多個數據庫連接,並且我找不到連接數量和子進程數量之間的任何關聯。 。 例如,我有3個孩子,和5個DB連接。 我試圖建立持久的連接,但並沒有改變任何東西。

第二個問題 :是PDO為MySQL提供了這些額外的連接器,還是MySQL驅動程序? 有沒有辦法強迫他們使用一個連接? 我不認為這是我的錯,每次我調用創建PDO對象的方法時,我的代碼都會打印警報以進行控制台,並且在腳本開始之前,在派生之前僅發生一次。 之后,我僅使用父級的PDO對象運行子級查詢。 由於MySQL的限制,我再也負擔不起這么多的連接。

第三個問題 :一千個套接字連接本身是否會成為問題? 除了CPU和數據庫負載外,我的意思是。 或者我應該做一些較小的服務器(例如128個連接),如果超過最大連接數,這些服務器將告訴客戶端連接到另一台服務器?

預先感謝您的時間和可能的答案。

當前,您最關心的應該是套接字服務器體系結構。 為每個客戶分叉一個過程非常繁瑣。 AFAIK,一台普通的PC可以忍受大約2000個線程,並且無法快速運行。 在進程之間進行切換意味着CPU應該將其狀態保存在內存中,並且如果您有大量的進程,CPU將忙於內存IO,並且幾乎沒有時間進行實際操作。

您可能想看看Apache的啟發。 在Apache中,它們使用固定數量的工作進程/線程,每個進程/線程通過select函數和套接字在非阻塞模式下與多個客戶端一起工作。 這是一種更為可靠的方法。

關於數據庫IO,我將產生一個將成為數據庫連接唯一所有者的進程/線程。 輔助進程將使用IPC(對於進程)或無鎖隊列(對於線程)與DB IO進程進行通信。 這種方法使您獨立於PDO實施細節(如果它是線程安全的或生成連接等)。

PS我懷疑您實際上是通過派生產生了新的PDO對象(派生僅意味着使用其內存及其中的所有內容制作一個進程的副本),而PDO對象會根據需要創建和關閉連接。 它可以解釋為什么您看不到低流量客戶端和數據庫連接之間的關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM