push.php
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
使用Workerman \ Worker
需要壹次。/worker man/auto loader . PHP ';
//初始化工作容器並偵聽端口1234。
$ Worker = new Worker(' web socket://0 . 0 . 0 . 0:1234 ');
//這裏的進程數必須設置為1。
$ worker-& gt;count = 1;
//在工作進程啟動後建立內部通信端口。
$ worker-& gt;onWorkerStart = function($worker)
{
//開放內部端口,方便內部系統推送數據。文本協議格式文本+換行符。
$inner_text_worker =新工人(' Text://0 . 0 . 0:5678 ');
$ inner _ text _ worker-& gt;onMessage = function($connection,$buffer)
{
全局$ worker
//$數據數組格式,其中包含uid,這意味著使用該uid將數據推送到頁面。
$data = json_decode($buffer,true);
$ uid = $ data[' uid '];
//通過workerman將數據推送到uid的頁面。
$ret = sendMessageByUid($uid,$ buffer);
//返回推送結果。
$ connection-& gt;發送($ret?ok ':' fail ');
};
$ inner _ text _ worker-& gt;聽();
};
//添加新的屬性來保存從uid到連接的映射。
$ worker-& gt;uid connections = array();
//從客戶端發送消息時執行的回調函數。
$ worker-& gt;onMessage = function($connection,$data)use($worker)
{
//判斷當前客戶端是否經過認證,即是否設置了uid。
如果(!isset($ connection-& gt;uid))
{
//如果沒有驗證,就把第壹個包當作uid(為了演示方便,這裏不做真正的驗證)
$ connection-& gt;uid = $ data
/*保存uid到connection的映射,方便通過uid查找連接。
*推送特定uid的數據。
*/
$ worker-& gt;uid connections[$ connection-& gt;uid]= $ connection;
返回;
}
};
//客戶端斷開連接時。
$ worker-& gt;onClose = function($ connection)use($ worker)
{
全局$ worker
if(isset($ connection-& gt;uid))
{
//連接斷開時刪除映射
unset($ worker-& gt;uid connections[$ connection-& gt;uid]);
}
};
//將數據推送給所有經過身份驗證的用戶。
功能廣播($消息)
{
全局$ worker
foreach($ worker-& gt;uidConnections as $connection)
{
$ connection-& gt;send($ message);
}
}
//為uid推送數據
函數sendMessageByUid($uid,$message)
{
全局$ worker
if(isset($ worker-& gt;uidConnections[$uid]))
{
$ connection = $ worker-& gt;uid connections[$ uid];
$ connection-& gt;send($ message);
返回true
}
返回false
}
//運行所有工作線程(實際上,當前只定義了壹個)
worker::runAll();
啟動後端服務
PHP push.php啟動-d
前端接收推送的js代碼。
var ws = new web socket(' ws://127 . 0 . 0 . 1:1234 ');
ws.onopen = function(){
var uid = ' uid 1 ';
ws . send(uid);
};
ws.onmessage = function(e){
警報(電子數據);
};
後端推送消息的代碼
//建立壹個套接字連接到內部推送端口
$ CLIENT = STREAM _ socket _ CLIENT(' TCP://127 . 0 . 0 . 1:5678 ',$errno,$errmsg,1,STREAM _ CLIENT _ CONNECT | STREAM _ CLIENT _ PERSISTENT);
//推送的數據包含uid字段,表示推送到這個uid。
$ data = array(' uid ' = & gt;uid1 ',' percent ' = & gt'88%');
//發送數據。註意,5678端口是文本協議的端口,文本協議需要在數據末尾加壹個換行符。
fwrite($client,json_encode($data)。" \ n ");
//讀取推送結果
echo fread($客戶端,8192);
這裏的uid不壹定是用戶的id,也可以理解為任務id,即task id。
以上代碼pro測試可以直接使用。