日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php socket 效率,php socket 模型及效率问题

發布時間:2024/4/13 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 模型及效率问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。