您现在的位置是:首页 > 博客日记 > Php Php

使用Workerman搭建websocket

2017-06-27 00:00:00 【Php】 人已围观

1.安装

composer require tinymeng/worker-socket:~1.0.0 -vvv

2.业务逻辑(Events类)

在项目/application/index/controller下创建文件Events类 Events.php

首先创建控制器类并继承 tinymeng\worker\Server,然后设置属性和添加回调方法

2.1 ThinkPhp框架示例如下:
  1. <?php
  2. /**
  3. * Name: Events.php.
  4. * Author: JiaMeng <666@majiameng.com>
  5. * Description: websocket callback
  6. */
  7. namespace app\index\controller;
  8. use tinymeng\worker\Server;
  9. use GatewayWorker\Lib\Gateway;
  10. class Events extends Server{
  11. /**
  12. * @var string Socket connect address
  13. */
  14. protected $socket = 'websocket://0.0.0.0:1314';
  15. /**
  16. * @var string The current class of namespace
  17. */
  18. protected $eventHandler = 'app\index\controller\Events';
  19. /**
  20. * Description: 当客户端连接时时触发
  21. * @param $client_id
  22. */
  23. public static function onConnect($client_id){
  24. echo 'client_id : '.$client_id. ', connect ' .PHP_EOL;
  25. }
  26. /**
  27. * Description: 当客户端发来消息时触发
  28. * Author: JiaMeng <666@majiameng.com>
  29. * @param int $client_id 连接id
  30. * @param string $data 具体消息
  31. * @return bool
  32. */
  33. public static function onMessage($client_id, $data) {
  34. echo 'client : '.$client_id. ',message data :'.$data .PHP_EOL;
  35. }
  36. /**
  37. * Description: 当客户端断开连接时触发
  38. * Author: JiaMeng <666@majiameng.com>
  39. * Updater:
  40. * @param int $client_id 连接id
  41. */
  42. public static function onClose($client_id) {
  43. echo 'client_id : '.$client_id .' close '.PHP_EOL;
  44. }
  45. }

支持workerman所有的回调方法定义(回调方法必须是public static类型)

3.启动项目

在应用根目录增加入口文件 socket.php

3.1.1 ThinkPhp框架示例如下:
  1. #!/usr/bin/env php
  2. <?php
  3. /**
  4. * 用于检测业务代码死循环或者长时间阻塞等问题
  5. * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php socket.php reload
  6. * 然后观察一段时间workerman.log看是否有process_timeout异常
  7. */
  8. //declare(ticks=1);
  9. define('APP_PATH', __DIR__ . '/application/');
  10. /** Events类,根据自己的模块和控制器填写 */
  11. define('BIND_MODULE','index/Events');
  12. // 加载框架引导文件
  13. require __DIR__ . '/thinkphp/start.php';
3.1.2 Laravel框架示例如下:
  1. #!/usr/bin/env php
  2. <?php
  3. /**
  4. * 用于检测业务代码死循环或者长时间阻塞等问题
  5. * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php socket.php reload
  6. * 然后观察一段时间workerman.log看是否有process_timeout异常
  7. */
  8. //declare(ticks=1);
  9. define('LARAVEL_START', microtime(true));
  10. require __DIR__.'/vendor/autoload.php';
  11. $app = require_once __DIR__.'/bootstrap/app.php';
  12. /** Events类,根据自己的命名规范填写 */
  13. $kernel = $app->make(App\Http\Controllers\EventsController::class);
3.1.3 Yii框架示例如下:
  1. #!/usr/bin/env php
  2. <?php
  3. /**
  4. * worker-socket command socket file.
  5. */
  6. defined('YII_DEBUG') or define('YII_DEBUG', true);
  7. defined('YII_ENV') or define('YII_ENV', 'dev');
  8. require __DIR__ . '/vendor/autoload.php';
  9. require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
  10. $config = [
  11. /** Events类,根据自己的命名规范填写 */
  12. 'class' => 'backend\controllers\EventController',
  13. ];
  14. $modifyPassword = Yii::createObject($config);
3.2 在命令行启动服务端 php socket.php start
  1. [root@izbp153yczpm4pp9pjs0u3z majiameng.com]# php socket.php start
  2. Workerman[server.php] start in DEBUG mode
  3. ----------------------- WORKERMAN -----------------------------
  4. Workerman version:3.5.13 PHP version:7.2.6
  5. ------------------------ WORKERS -------------------------------
  6. user worker listen processes status
  7. root ChatBusinessWorker none 4 [OK]
  8. root ChatGateway websocket://0.0.0.0:1314 4 [OK]
  9. root Register text://0.0.0.0:1236 1 [OK]
  10. ----------------------------------------------------------------
  11. Press Ctrl+C to stop. Start success.
linux下面可以支持下面指令
  1. php socket.php start|stop|status|restart|reload
需要后台运行的话
  1. php socket.php start -d

4.测试

在浏览器中进行客户端测试

//www.blue-zero.com/WebSocket/

输入socket地址 ws://IP:1314 测试socket服务是否正常

网站事例: 打开 (需要登录哦!)

大家如果有问题要交流,就发在这里吧: worke-socket 交流 或发邮件 666@majiameng.com



关注TinyMeng博客,更多精彩分享,敬请期待!
 

很赞哦! ()