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