ThinkPHP5中使用Workerman框架

ThinkPHP框架不多说,强悍之处不容置疑。有疑问看官方手册

Workerman框架也是非常强悍的(开发框架人的背景不是很清楚),官方是这样介绍的:

Workerman,让你看到PHP不为人知的一面。
当然详细的介绍WM官方也给出了非常详细的手册。
这里也并不打算长篇的介绍和吹嘘TP与WM的强悍的话。
以前在使用TP3.2.3的时候,就接触使用了Workerman框架,但当时TP官方并没有把WM集成进来,
也就分开独立使用两个框架了,各司其职。
现在TP5中已经把WM作为扩展集成进来了。

集成步骤也请看TP5的手册:

https://www.kancloud.cn/manual/thinkphp5/235128

下面把TP5官方给出的示例代码:
<?php
namespace app\index\controller;

use think\worker\Server;
use Workerman\Lib\Timer; // 引入WM框架的类库,

class Worker extends Server
{
//     protected $socket = ‘http://0.0.0.0:2348‘;
    protected $socket = ‘tcp://0.0.0.0:2349‘;

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        // 给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间
        $connection->lastMessageTime = time();
        
        $connection->send(json_encode($data));
        $connection->send(‘我收到你的信息了‘);
    }
    
    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {
        echo $connection->getRemoteIP();
    }
    
    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        echo $connection->id . ‘disconnect \r\n‘;
    }
    
    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }
    
    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {
        // 进程启动后设置一个每秒运行一次的定时器
        Timer::add(1, function ()use($worker){
            $time_now = time();
            foreach ($worker->connections as $connection) {
                // 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
                if (empty($connection->lastMessageTime)) {
                    $connection->lastMessageTime = $time_now;
                    continue;
                }
                // 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
                if ($time_now - $connection->lastMessageTime > 10) {
                    $connection->close();
                }
            }
        });
        echo $worker->id . "\r\n";
    }
}
这个示例是用来作为TCP协议开发的,看onMessage、onWorkerStart两个函数,是增加一个定时器,
因为是做TCP服务端,必须要使用心跳来检测客户端是否因极端情况(断电、异常关机)
而导致断开(这种状况服务端是无法立即得知客户端的断开状态的)。
实现的逻辑是Worker类继承Server类,Worker类中给参数赋值,
然后由父类的Server构造函数来实例化Worker对象,

------------------------------------------------------------

Server.php

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

namespace think\worker;

use Workerman\Worker;
use Workerman\Lib\Timer;

/**
 * Worker控制器扩展类
 */
abstract class Server
{
    protected $worker;
    protected $worker2;
    protected $socket    = ‘‘;
    protected $protocol  = ‘http‘;
    protected $host      = ‘0.0.0.0‘;
    protected $port      = ‘2346‘;
    protected $processes = 1;

    /**
     * 架构函数
     * @access public
     */
    public function __construct()
    {
        // 实例化 Websocket 服务
        $this->worker = new Worker($this->socket ?: $this->protocol . ‘://‘ . $this->host . ‘:‘ . $this->port);
//         $this->worker2 = new Worker(‘tcp://0.0.0.0:2349‘);
        // 设置进程数
        $this->worker->count = $this->processes;
        // 设置进程名称
        $this->worker->name = "bluetooth";
        // 初始化
        $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();
    }

    protected function init()
    {
    }

}

虽然是集成进来,但依旧很灵活,可以在Server.php里面自定义你所需要的任意WM功能。

时间: 2024-11-03 22:01:44

ThinkPHP5中使用Workerman框架的相关文章

ThinkPHP5中使用workman框架与硬件设备蓝牙锁通讯

未完待续...

在ns2.35中添加myevalvid框架

在用ns2进行网络视频通信仿真的时候,先要为我们自己的ns2添加evalvid或者myevalvid框架.其中myevalvid框架是由柯志亨老师整合evalvid和ns2之后得出的新框架,笔者建议大家安装该框架,而不要安装原生的evalvid框架.这样就可以结合柯志亨老师的<ns2仿真实验-----多媒体和无线网络通信>这本书,做配套的实验,比较方便. 网上关于myevalvid框架的安装文章很多,大家可以参考去做,笔者会在本文最后给出相关的链接.本文主要是对myevalvid框架源码中的错

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

step4---&gt;往工程中添加Spring框架----&gt;修改maven的配置文件pom.xml,向工程中添加spring框架的某些模块

1.本文内容: 本文介绍使用maven向自己的项目中添加各种框架的方法,即如何配置maven的pom.xml来让maven帮助管理这些框架(包括Spring.SpringMVC.hibernate框架等等). 2.使用maven向自己的工程中添加框架: 2.1概述 若想使用maven向自己的工程中添加三方框架(如Spring.SpringMVC等),需要先确保你的工程是maven工程,如果你还不知道该如何在myeclipse中建立一个maven web project,请参考相关教程. 2.2使

FreeBSD中的SYSINIT框架【转】

SYSINIT是一个通用的调用排序与分别执行机制的框架.FreeBSD目前使用它来进行内核的动态初始化.SYSINIT使得FreeBSD的内核各子系统可以在内核或模块动态加载链接时被重整.添加.删除.替换,这样,内核和模块加载时就不必去修改一个静态的有序初始化安排表甚至重新编译内核.这个体系也使得内核模块(现在称为KLD可以与内核不同时编译.链接.在引导系统时加载,甚至在系统运行时加载.这些操作是通过"内核链接器"(kernel linker)和"链接器集合"(li

关于jsp商城开发中一些常用框架的介绍

Struts跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点,使java商城产品以及jsp商城开发者能更深入的了解其内部实现机制.除此之外,在 java商城开发 中Struts的优点主要集中体现在两个方面:Taglib和页面导航.Taglib是Struts的标记库,比较灵活,能大大提高开发效率.另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点.struts历经6年多的发展,是目前用户数最

简单的介绍下WPF中的MVVM框架

最近在研究学习Swift,苹果希望它迅速取代复杂的Objective-C开发,引发了一大堆热潮去学它,放眼望去各个培训机构都已打着Swift开发0基础快速上手的招牌了.不过我觉得,等同于无C++基础上手学习C#一样,即使将来OC被淘汰,那也是N年之后的事情,如果真的要做IOS开发,趁现在Swift才刚开始,花那么几个月去了解一下OC绝对是一件有帮助的事情. 扯远了,我前几天刚接触到一个叫做mvvm的框架,发现很有意思,带着学习的态度来写点东西,不足之处一起研究.还有一个很重要的原因,我发现不少同

Java项目在jsp页面中引入jquery框架的步骤

环境:在Java  web项目中引入juqery框架 工具:MyEclipse8.5 [步骤如下] A:新建一个Java web项目TestJquery,在WebRoot目录下创建一个jquery文件夹 B:下载jquery-1.8.3.min.js放入jquery文件夹中 C:创建jsp页面 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%&g

3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop中的RPC应用实例demo 在windows是调用端,在linux里是服务端. 在这里,需要LoginServiceinterface.java 停止 出错误了,很明显. 这是个很好的思考题?