當前位置:股票大全官網 - 股票投資 - php後端如何將消息及時推送到客戶端

php後端如何將消息及時推送到客戶端

後端代碼

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測試可以直接使用。