谈谈利用workerman实现即时聊天功能的方法-Workerman-PHP中文网

来源: 谈谈利用workerman实现即时聊天功能的方法-Workerman-PHP中文网

本篇文章给大家介绍一下使用workerman实现即时聊天的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

相关推荐:《workerman教程》

开发文档:http://doc2.workerman.net/

下载服务器端安装文件:

有windows版和linux版两个版本,我下载的linux版,在windows上也可以运行。

打开后有这些文件:

把这个文件放在服务器上或者项目中都可以,需要运行的就是最后一个start_for_win.bat文件。

运行成功。

修改start_gateway.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

/**

* This file is part of workerman.

*

* Licensed under The MIT License

* For full copyright and license information, please see the MIT-LICENSE.txt

* Redistributions of files must retain the above copyright notice.

*

* @author walkor<walkor@workerman.net>

* @copyright walkor<walkor@workerman.net>

* @link http://www.workerman.net/

* @license http://www.opensource.org/licenses/mit-license.php MIT License

*/

use \Workerman\Worker;

use \Workerman\WebServer;

use \GatewayWorker\Gateway;

use \GatewayWorker\BusinessWorker;

use \Workerman\Autoloader;

// 自动加载类

require_once __DIR__ . ‘/../../vendor/autoload.php’;

// gateway 进程,这里使用Text协议,可以用telnet测试

$gateway = new Gateway(“websocket://0.0.0.0:8282”);

// gateway名称,status方便查看

$gateway->name = ‘YourAppGateway’;

// gateway进程数

$gateway->count = 4;

// 本机ip,分布式部署时使用内网ip

$gateway->lanIp = ‘127.0.0.1’;

// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000

// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口

$gateway->startPort = 2900;

// 服务注册地址

$gateway->registerAddress = ‘127.0.0.1:1238’;

// 心跳间隔

$gateway->pingInterval = 60;

// 心跳数据

$gateway->pingData = ‘{“type”:”ping”}’;

/*

// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调

$gateway->onConnect = function($connection)

{

$connection->onWebSocketConnect = function($connection , $http_header)

{

// 可以在这里判断连接来源是否合法,不合法就关掉连接

// $_SERVER[‘HTTP_ORIGIN’]标识来自哪个站点的页面发起的websocket链接

if($_SERVER[‘HTTP_ORIGIN’] != ‘http://kedou.workerman.net’)

{

$connection->close();

}

// onWebSocketConnect 里面$_GET $_SERVER是可用的

// var_dump($_GET, $_SERVER);

};

};

*/

// 如果不是在根目录启动,则运行runAll方法

if(!defined(‘GLOBAL_START’))

{

Worker::runAll();

}

第24行,把tcp协议改为websocket协议;

第38行和40行,设置服务器向客户端发送的心跳时间,检测客户端是否连接,未连接将会断开。

下面的内容都是默认注释掉的,根据自己的需要打开或者修改。

再次运行start_for_win.bat文件:

协议就变为websocket协议了,现在就可以做项目内的操作了。

还需要再下载一个文件:https://github.com/walkor/GatewayClient

把这几个文件放进thinkphp的extend文件夹下(我用的是thinkphp5.0版本):

在Gateway.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

    • ws://127.0.0.1:8282

 

    {volist name=”msg” id=”vo” empty=”这里没有数据” key =’s’}

    {$vo.user_name}:

    {$vo.msg}

    {$vo.createtime}

    {/volist}

    第42—52行把client_id传到后台,与用户表中用户进行绑定。

    后台代码:

    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

    namespace app\api\controller;

    use think\Controller;

    use GatewayClient\Gateway;

    use think\Db;

    class Index extends Controller

    {

    public function websocket(){

    $where=[];

    $user_id=1;

    $where[‘from_id|to_id’]=$user_id;

    $msg=Db::name(‘msg’)->where($where)->select();

    foreach ($msg as $key=>$val){

    $msg[$key][‘createtime’]=date(‘Y-m-d H:i:s’,$val[‘createtime’]);

    $msg[$key][‘user_name’]=Db::name(‘user’)->where([‘id’=>$val[‘from_id’]])->value(‘name’);

    }

    $this->assign(‘msg’,$msg);

    return view();

    }

    //绑定用户

    public function user_bind($user_id=1){

    //$user_id=1; //发送人用户id

    $client_id = input(‘post.client_id’);

    //        $user=Db::name(‘user’)->where([‘id’=>$user_id])->find();

    Gateway::bindUid($client_id, 1);

    return $client_id;

    }

    //发送信息

    public function send_msg(){

    $msg=input(‘msg’);

    if($msg){

    $data=[

    ‘msg’=>$msg,

    ‘from_id’=>1,

    ‘to_id’=>2,

    ‘createtime’=>time()

    ];

    Db::name(‘msg’)->insert($data);

    Gateway::sendToUid(1,$msg);

    Gateway::sendToUid(2,$msg);

    }

    return ‘success’;

    }

    }

    发送消息存入数据库,页面显示即可。

    更多计算机编程相关知识,请访问:编程视频!!

    以上就是谈谈利用workerman实现即时聊天功能的方法的详细内容,更多请关注php中文网其它相关文章!</walkor@workerman.net></walkor@workerman.net>

    赞(0) 打赏
    分享到: 更多 (0)

    觉得文章有用就打赏一下文章作者

    支付宝扫一扫打赏

    微信扫一扫打赏