php socket 效率,php socket 模型及效率问题
php socket 模型及效率問題
呼呼安3票
呼呼安70
//創建套接字
socket_create();//綁定
socket_bind();//監聽
socket_listen();//主體, 死循環
while(true){//select模型, 取出可讀套接字列表
socket_select();foreach(sockets) {//如果是監聽連接請求端口的套接字
if(islistensocket) {//接受請求
socket_accept();
}else{//讀取封包
socket-_recv();//處理用戶動作 {問題就在這}
process();
}
}
}
關于php做服務端的效率, 我想這里是個問題吧。
在每處理一個用戶的動作的時候, 整個循環被阻塞在這里, 導致其他的連接不能接受, 其他用戶的動作請求不能被處理。 直到process()函數返回才能處理下一個動作。
處理一個用戶動作的時候, 可能還要涉及到數據庫訪問等, 可能比較耗時。
不知道有沒有哪位大仙有解決辦法呢。
我想的是, 如果能做一個動作隊列, 這里的循環只負責接收數據, 然后把數據包保存在一個隊列里, 就去接收下一個用戶的封包。
另一個線程(不知道PHP怎么實現線程, 或是能不能實現)從隊列中抽取每一個用戶的動作請求來處理它。。
或著process()函數能不能做成非阻塞的, 讓它可以立即返回。。
小弟初學,如有可笑之處,請見諒!
評論 (0) ? 分享 ? 鏈接 ? 2012-07-244個答案 票 數
馮義軍1票
馮義軍14.02K
最佳答案
這個問題我也遇到過到,比如打開兩個終端,telnet socket服務端,如果其中一個不返回,另一個終端總是等待。最后使用fork子進程方式解決,大概代碼如下,你可以參考下:
死循環部分do{
$msgsock=socket_accept($socket);
$pid=pcntl_fork();if($pid == -1) {//fork error ;
}else if($pid) {
socket_close($msgsock);
}else{
$buf= socket_read($msgsock,1024,PHP_NORMAL_READ);
$ret= func($buf); //調用函數處理接收到的內容
socket_write($msgsock,$ret,strlen($ret));
socket_close($msgsock);//posix_kill(posix_getpid(),0);
exit();
}
}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 xxx.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) {//從數據庫里取出一條待處理動作//處理它//從數據庫里刪除該動作
}
甚至可以多運行幾次這個文件, 就是不知道想停的時候怎么停>_
龍蝦貓1
風大做了一個基于pcntl的多進程Socket服務框架,可以參考使用下
http://code.google.com/p/mpass/
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的php socket 效率,php socket 模型及效率问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中滚动显示文字,HTML如何实现文
- 下一篇: php自定义框架,「php 框架」自定义