php socket 模型及效率問題

2021-09-07 06:07:30 字數 1901 閱讀 4102

//

建立套接字

socket_create();

//繫結

socket_bind();

//監聽

socket_listen();

//主體, 死迴圈

while(true

)

else

process();

}}}

php socket 模型及效率問題

呼呼安3

票 呼呼安

70//

建立套接字

socket_create();

//繫結

socket_bind();

//監聽

socket_listen();

//主體, 死迴圈

while(true

)

else

process();}}}

關於php做服務端的效率, 我想這裡是個問題吧。

在每處理乙個使用者的動作的時候, 整個迴圈被阻塞在這裡, 導致其他的連線不能接受, 其他使用者的動作請求不能被處理。 直到process()函式返回才能處理下乙個動作。

處理乙個使用者動作的時候, 可能還要涉及到資料庫訪問等, 可能比較耗時。

不知道有沒有哪位大仙有解決辦法呢。

我想的是, 如果能做乙個動作佇列, 這裡的迴圈只負責接收資料, 然後把資料報儲存在乙個佇列裡, 就去接收下乙個使用者的封包。

另乙個執行緒(不知道php怎麼實現執行緒, 或是能不能實現)從佇列中抽取每乙個使用者的動作請求來處理它。。

或著process()函式能不能做成非阻塞的, 讓它可以立即返回。。

小弟初學,如有可笑之處,請見諒!

0) • 分享 • 鏈結 • 2012-07-24

4個答案 票 數

馮義軍1

票馮義軍14.02k

最佳答案

死迴圈部分

doelse

if($pid)

else

}while(true

)10) • 鏈結 • 2012-07-25

0@馮義軍 你好, 我在本地測試的時候, 可以用cmd執行php, 或是在網頁上訪問一下, 然後關閉網頁就行了, php會一直執行, 然後埠就可以一直訪問。。

但是我放伺服器上(linux), 怎麼讓它一直執行啊, 我用網頁訪問它的時候可以連線, 如果關了網頁, 就會關閉。 – 呼呼安

2012-07-28

0@呼呼安 在 socket服務端程式中 開頭增加 ignore_user_abort(

1); set_time_limit(0

); 這兩句,就可以執行一次關瀏覽器了。

另外還可以在命令列執行,如 /usr/local/php/bin ***.php & – 馮義軍 2012-07-28

0@馮義軍 set_time_limit(

0)這個我加了, ignore_user_abort(1);這個沒加就不行嗎 – 呼呼安 2012-07-30

0@呼呼安 ignore_user_abort();主要是設定與客戶機斷開是否會終止指令碼的行,set_time_limit() 主要是指定程式執行的最大時間。 – 馮義軍

2012-08-02

呼呼安2

票呼呼安70

我貌似自己想到了乙個辦法。。

process()的地方修改一下, 直接寫到資料庫裡(或著誰有更快的方法請告知)。

就是我所說的「動作佇列」。

再寫乙個類似的php檔案, 也是死迴圈。

while(true

) 0) • 鏈結 • 2012-07-25

龍蝦貓0

票龍蝦貓1

風大做了乙個基於pcntl的多程序socket服務框架,可以參考使用下

你擔心handlerThread的效率問題嗎?

handlerthread handler looper messagequeue相互關聯對應 queue是通過msg.next指向下乙個msg來實現,mmessages代表當前的message,每取出乙個msg,移動一次mmessages,一直到最後乙個msg handlerthread是乙個執行...

sql語法及效率

應用場景 從乙個表中,根據訂單id,查詢出n個訂單的資訊 select x1,x2,x3 from y1 where z n1 or z n2 or z n3.select x1,x2,x3 from y1 where z in n1,n2,n3.首選是用where in,因為 or效率 o n i...

演算法及演算法效率

一 演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。二 演算法的特性 輸入輸出 演算法就有零個或多個輸入,演算法至少要有乙個或多個輸出 有窮性 在演算法執行有限的步驟後,自動結束而不是出現無限迴圈,並且每乙個步驟在可接受範圍內完成。確...