第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在php后端及時推送消息給客戶端

如何在php后端及時推送消息給客戶端

PHP
Qyouu 2019-03-03 08:04:53
如何在php后端及時推送消息給客戶端 
查看完整描述

1 回答

?
繁星點點滴滴

TA貢獻1803條經(jīng)驗 獲得超3個贊

后端代碼push.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

<?php

use Workerman\Worker;

require_once './Workerman/Autoloader.php';

// 初始化一個worker容器,監(jiān)聽1234端口

$worker = new Worker('websocket://0.0.0.0:1234');

// 這里進程數(shù)必須設(shè)置為1

$worker->count = 1;

// worker進程啟動后建立一個內(nèi)部通訊端口

$worker->onWorkerStart = function($worker)

{

    // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符

    $inner_text_worker = new Worker('Text://0.0.0.0:5678');

    $inner_text_worker->onMessage = function($connection, $buffer)

    {

        global $worker;

        // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)

        $data = json_decode($buffer, true);

        $uid = $data['uid'];

        // 通過workerman,向uid的頁面推送數(shù)據(jù)

        $ret = sendMessageByUid($uid, $buffer);

        // 返回推送結(jié)果

        $connection->send($ret ? 'ok' : 'fail');

    };

    $inner_text_worker->listen();

};

// 新增加一個屬性,用來保存uid到connection的映射

$worker->uidConnections = array();

// 當有客戶端發(fā)來消息時執(zhí)行的回調(diào)函數(shù)

$worker->onMessage = function($connection, $data)use($worker)

{

    // 判斷當前客戶端是否已經(jīng)驗證,既是否設(shè)置了uid

    if(!isset($connection->uid))

    {

       // 沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證)

       $connection->uid = $data;

       /* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,

        * 實現(xiàn)針對特定uid推送數(shù)據(jù)

        */

       $worker->uidConnections[$connection->uid] = $connection;

       return;

    }

};

 

// 當有客戶端連接斷開時

$worker->onClose = function($connection)use($worker)

{

    global $worker;

    if(isset($connection->uid))

    {

        // 連接斷開時刪除映射

        unset($worker->uidConnections[$connection->uid]);

    }

};

 

// 向所有驗證的用戶推送數(shù)據(jù)

function broadcast($message)

{

   global $worker;

   foreach($worker->uidConnections as $connection)

   {

        $connection->send($message);

   }

}

 

// 針對uid推送數(shù)據(jù)

function sendMessageByUid($uid, $message)

{

    global $worker;

    if(isset($worker->uidConnections[$uid]))

    {

        $connection = $worker->uidConnections[$uid];

        $connection->send($message);

        return true;

    }

    return false;

}

 

// 運行所有的worker(其實當前只定義了一個)

Worker::runAll();

 

 

啟動后端服務(wù)

php push.php start -d

 

前端接收推送的js代碼

var ws = new WebSocket('ws://127.0.0.1:1234');

ws.onopen = function(){

    var uid = 'uid1';

    ws.send(uid);

};

ws.onmessage = function(e){

    alert(e.data);

};

后端推送消息的代碼

1

2

3

4

5

6

7

8

// 建立socket連接到內(nèi)部推送端口

$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1,  STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);

// 推送的數(shù)據(jù),包含uid字段,表示是給這個uid推送

$data = array('uid'=>'uid1', 'percent'=>'88%');

// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符

fwrite($client, json_encode($data)."\n");

// 讀取推送結(jié)果

echo fread($client, 8192);

這里的uid不一定是用戶的id,也可以理解為任務(wù)id即 taskid以上代碼親測可以直接使用


 


查看完整回答
反對 回復 2019-03-10
  • 1 回答
  • 0 關(guān)注
  • 663 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號