Workerman集成ThinkPHP

零度开水 发布于 2016/05/27 18:29
阅读 6K+
收藏 6

关于Workerman与ThinkPHP集成的问题,相信已经有大神给出了答案。不过因为各人理解不一样,解决方案也是互有异同。

ThinkPHP版本:3.2.1+

Workerman版本:3.3.0+

第一步:将Workerman复制到ThinkPHP项目中的适当位置(我是放到根目录,与ThinkPHP平级)

第二步:将Workerman中的所有文件(除/Workerman/Lib/Constants.php外)后缀改为.class.php,如:Worker.php改为Worker.class.php

第三步:配置ThinkPHP的命名空间自动加载。在ThinkPHP的配置文件中加入

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

第四步:在ThinkPHP项目中新增Worker模块和Worker控制器,也可以根据自己的喜好来命名

namespace Worker\Controller;
use Workerman\Worker;

class Worker {
    public function Start() {
        $worker = new Worker('text://0.0.0.0:1234'); //实例化Worker,并设置协议、IP和端口
        $worker->count = 4;
        $worker->onMessage = array($this, 'onMessage');
        //worker的其它回调方法可以参考onMessage
        Worker::runAll();
    }

    public function onMessage($connection, $data) {
        $connection->send('something...');
    }
}

在onMessage方法中,还可以根据自定义的协议和内容格式,通过ThinkPHP的A()方法来调用相关的模块、控制器,就可以做到跟普通的ThinkPHP项目相同的开发模式了,如:


$class = A($data['m'] . '/' . $data['c']);
if (!$class) {
    $connection->send('Module or Controller not found.');
} else {
    $action = $data['a'];
    unset($data['m'], $data['c'], $data['a']);
    try {
        call_user_func_array(array($class, $action), $data);
    } catch (Exception $ex) {
        throw $ex;
    }
}

第五步:ThinkPHP入口绑定。入口绑定是ThinkPHP3.2.1+给出的方法,之前的版本也有相应的方法,网上是可以查得到的。

新建入口文件worker.php


define('BIND_MODULE', 'Worker');
define('BIND_CONTROLLER', 'Worker');
define('BIND_ACTION', 'Start')

//ThinkPHP的其他设定

require './ThinkPHP/ThinkPHP.php';

最后:进入项目文件夹,直接通过php运行worker.php文件,运行参数跟Workerman一样,如:

运行:php worker.php start

守护进程模式运行:php worker.php start -d

重启:php worker.php restart

平滑重启:php worker.php reload

查看状态:php worker.php status


总结:因为ThinkPHP的自动加载方式,所以在默认设定下,可能会加载一些没必要加载的类库,如何解决这个问题可以参考ThinkPHP的自定义模式。


加载中
0
官方入员
官方入员
还是有很多问题. 要处理 exption,die,exit,exception
0
亮亮哥呀
亮亮哥呀

这个workerman与thinkPHP的实战项目视频不错,利用websocket协议实现了长连接,来做即时通讯,在线客服。

地址 http://study.163.com/course/introduction/1005015012.htm?share=2&shareId=400000000388007

0
亮亮哥呀
亮亮哥呀

这个workerman与thinkPHP的实战项目视频不错,利用websocket协议实现了长连接,来做即时通讯,在线客服。地址   http://study.163.com/course/introduction/1005015012.htm?share=2&shareId=400000000388007

0
亮亮哥呀
亮亮哥呀

workerman实战教程了解一下哦,一上午就会在项目里使用了。 http://study.163.com/course/introduction/1005015012.htm?share=2&shareId=400000000388007​

返回顶部
顶部