zoukankan      html  css  js  c++  java
  • workerman 做即时通讯 做推送 在线人数解决强退问题 也可做聊天系统

    1 下载workerman解压在项目Library下面每个文件加.class 除Controller.php外   改名字为Workerman

    2 config添加 命名空间自动加载

    'AUTOLOAD_NAMESPACE' => array(
    'Workerman' => ROOT_PATH1 . 'Worker',//根据自己的存放位置修改
    ),

    3 新建Worker模块 入口文件worker.php  WorkerController.class.php

    worker.php

    <?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
    // +----------------------------------------------------------------------
    // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
    // +----------------------------------------------------------------------
    // | Author: liu21st <liu21st@gmail.com>
    // +----------------------------------------------------------------------

    // 应用入口文件

    // 检测PHP环境
    if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');

    // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
    define('APP_DEBUG',True);
    define('BIND_MODULE', 'Worker');
    define("SITE_PATH",__DIR__);
    // $_GET['m'] = "Home";
    // 定义应用目录
    define('APP_PATH','./App/');

    define('BIND_CONTROLLER', 'Worker');//限制终端才能访问该文件
    //define('BIND_ACTION', 'Start');
    //echo time();exit;
    // 引入ThinkPHP入口文件
    require './ThinkPHP/ThinkPHP.php';

    // 亲^_^ 后面不需要任何代码了 就是如此简单

    WorkerController.class.php

    <?php
    namespace WorkerController;
    use ThinkController;
    use WorkermanWorker;
    class WorkerController{
    protected $connection_uid;

    /**
    * 构造函数
    * @access public
    */
    public function __construct(){
    $this->connection_uid=0;
    $this->worker = new WorkermanWorker('websocket://0.0.0.0:8686');// 实例化 Websocket 服务
    $this->worker->count = 4;// 设置进程数
    // $this->init();//初始化
    // 设置回调
    foreach (['onWorkerStart', 'onConnect', 'onMessage', 'onClose', 'onError', 'onBufferFull', 'onBufferDrain', 'onWorkerStop', 'onWorkerReload'] as $event) {
    if (method_exists($this, $event)) {
    $this->worker->$event = [$this, $event];
    }
    }
    // Run worker
    Worker::runAll();
    }

    /**
    * 收到信息
    * @param $connection
    * @param $data
    */
    public function onMessage($connection, $data)
    {
    $data_id = json_decode($data, TRUE);
    $data_id['id'] = $this->connection_uid; //用户子进程id
    $data_id['oncline'] = count($this->worker->connections); //在线人数
    $data_id['time'] = time();

    foreach ($this->worker->connections as $conn) {
    $data_id['conn'] = $conn;
    $data = json_encode($data_id);
    $conn->send($data);
    }
    }

    /**
    * 当连接建立时触发的回调函数
    * @param $connection
    */
    public function onConnect($connection)
    {
    $this->connection_uid += 1;
    $data = '{"status":200,"msg":"建立连接","uid":'.$this->connection_uid.'}';
    foreach ($this->worker->connections as $conn) {
    $conn->send($data);
    }
    }


    /**
    * 当连接断开时触发的回调函数
    * @param $connection
    */
    public function onClose($connection)
    {
    $connection->send('断开连接');
    }

    /**
    * 当客户端的连接上发生错误时触发
    * @param $connection
    * @param $code
    * @param $msg
    */
    public function onError($connection, $code, $msg)
    {
    echo "error $code $msg ";
    }

    /**
    * 每个进程启动
    * @param $worker
    */
    public function onWorkerStart($worker)
    {

    }

    public function init(){

    }

    }

    4.终端php命令运行workerman

    5开启socket扩展问题暂时没遇到测试无需开启也能运用workerman

    ;extension=php_sockets.dll //将php.ini前边;去掉

  • 相关阅读:
    chrome、firefox、IE中input输入光标位置错位解决方案
    IE兼容opacity
    Linux下redis5的安装及伪分布式集群搭建
    Linux文件编辑命令详细整理
    saltstack
    redis集群
    系统调优
    centos7 telnet 登录升级ssh
    keepalive简单高可用 ha
    docker
  • 原文地址:https://www.cnblogs.com/zhang-bin/p/10137742.html
Copyright © 2011-2022 走看看