因為專案中需要實時獲取一些**資料,以前的做法是使用ajax做定時請求,眾所周知的原因這樣效能會比較差,想用websocket來重新實現。
我這裡想要實現的並不是簡單的「客戶端請求->服務端返回」這樣的邏輯,這種實現起來會很簡單,我要實現的是在伺服器端維護乙個列表,當有客戶端在這個列表中註冊的話,服務端便統一地定時地向這個列表中的使用者推送資料,這樣要比客戶端主動定時請求效能更好一些。
swoole2.0.6
php7.0.14
centos7
swoole的工作機制有點打破一般php開發者的思維習慣,如果平時沒有去了解一下php底層的服務實現的話,可能對swoole的工作方式會感覺到迷惑。因為php通常是隱藏了其作為伺服器一些細節,程式設計師只需要關心一次請求裡所要完成的工作即可。而swoole卻把底層的服務與程序機制、執行緒機制、網路通訊這些東西暴露了出來,如果學校裡學到的東西都記不清的話,需要花不少時間來進行學習。
最初使用nodejs做socket伺服器的時候,感覺特別簡單,至少對我所需要解決的問題而言,很容易就能達到我的要求。而swoole卻不太一樣,它提供了更多的技術細節出來,也就使得它在用起來的時候開發者需要去了解和處理很多這些細節上的問題。
$serv = new swoole\websocket\server("127.0.0.1", 9502);
$serv->on('open', function
($server, $req) );
$serv->on('message', function
($server, $req)
} else
if ($req->data == 'trends')
}});
$serv->on('close', function
($server, $fd) );
$serv->on('workerstart', function
($server, $workerid) \n";
if ($workerid == 0)
# 推資料資料 todo 優化,當資料沒有更新時,不需要反覆推送。
$server->push($fd, swoolecontroller::parsedata('allcoin', $allcoin));
}});
}});
$serv->start();
簡單來說,這段程式實現了乙個定時器。swoole的定時器並不像nodejs的定顯示器那樣可以直接寫在server程序裡,而是必須寫在worker啟動之後。如果試圖在worker啟動之前就新增定時器會報錯。而按照swoole的執行機制,worker是會啟動很多個的,而我實際上只需要乙個服務程序進行資料廣播,一開始總是在糾結這麼多worker,如果都註冊乙個定時器,那就相當於多個程序在進行廣播,這是沒必要的。後來看到乙個部落格給了我一點啟發,那就是判斷worker的id,只向其中的乙個worker註冊定時器。
很簡單的一種思路,卻讓我茅塞頓開,於是就有了上面的**。
開始的時候,想嘗試使用swoole.table來維護廣播使用者列表,以及要推送的資料,發現table並不適用,因為它實際上只是乙個key=>value的快取而已,而且儲存大小有限制,嘗試了一下心想還不如直接使用redis。於是就直接把這些資料維護在redis裡了。
與nodejs相比,swoole還有乙個不方便的地方在於客戶端只有乙個onmessage,要想讓客戶端了解傳遞的是什麼資料的話,必須把資料型別封裝在訊息裡,然後讓它自己去判斷。而nodejs在這方面的實現要自由一些,它可以自定義一些訊號,在收到不同的訊號時分別處理,如下所示:
socket.on('coins', function
(msg));
單就使用方便來說,還是nodejs更好用些。
以上。
PHP的swoole框架 擴充套件socket聊天示例
php 檔名 chat.php 建立websocket伺服器物件,監聽0.0.0.0 9502埠 ws new swoole websocket server 0.0.0.0 9502 監聽websocket連線開啟事件 ws on open function ws,request 監聽websoc...
Python 使用socket編寫TCP服務程式
使用socket編寫tcp服務程式 by 鄭瑞國 1 引用網路模組socket 2 建立乙個tcp網路套接字s 3 繫結本機ip位址和指定埠號 4 開始監聽 5 接受連線 6 接受資訊 import socket 1 引用網路模組socket s socket.socket socket.af in...
swoole實現websocket推送
環境配置 swoole 1.9.3 centos6.5 虛擬機器 php7.01 思路 通過server中的collections取出fd 寫乙個 admin.html 管理員推送頁面 與 client.html 客戶端 html頁面的websocket自行可編寫 並在server.php中mess...