Swoole整合ThinkPHP3.2系列教程二

本文介绍了Swoole与ThinkPHP3.2的整合过程,探讨了两种不同的架构模式,并分享了实际项目中遇到的问题。在理想的模式下,swoole作为独立服务常驻内存,仅在需要时与业务服务器交互。目前的实现方式是在工作进程和任务进程中加载TP框架,可能增加内存占用。此外,文章指出不支持WebSocket的浏览器是一个挑战,作者计划寻找解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

swoole和ThinkPHP的整合

先上一份在我们系统内部的swoole整合的架构预览

├─Application                           应用目录
│  │
│  ├─Cli                                Cli模块
│  │  ├─Controller                      制器类
│  │  │  ├─StartController              TP框架加载时默认加载的控制器
│  │  │  ├─SwooleController             我们的业务逻辑写在这里面
│  │  └─ ...
├─Swoole
│  │
│  ├─log                                swoole运行日志
│  ├─Server.php                         swoole的服务代码
│  ├─swoole.php                         用于cli模式下启动和软重启swoole服务

最早测试的时候不是这样搭建的,而是把Server.php里的关于服务的东西放在了TP控制器里,在cli模式下调用

php index.php(入口文件) Swoole/start (控制器/方法)

这种模式是把swoole套在了TP里运行,也是可行的,但是总觉得启动个swoole服务为毛还要告诉TP一声?

我们想要的一种模式是业务服务器独立运行,swoole服务作为守护进程常驻内存,当浏览器需要运行比较耗时的操作时,需要跟swoole服务进程建立长连接,当耗时的任务执行完毕时会通知浏览器已经完毕。

整个过程下来,swoole服务和业务服务不应该耦合在一起的。最完美的状态是swoole独立运行(使用swoole框架重新写耗时操作的业务逻辑代码),独立连接数据库。当浏览器执行这些任务时,就不再找业务服务器了,而是直接跟swoole服务打交道。

可是我们没有那么多的时间和精力,我们只能在swoole服务的进程里调用TP框架的东西,来执行我们在TP里写的代码。最后参考了网上的一些方案,选择了这样与TP结合。


代码逻辑

/Swoole/Server.php
  • 关于swoole服务的一些配置,比如监听地址,端口号(默认为9501),和一些基础配置

  • 一些回调函数,里面的代码注释很完整,可以直接看代码

<?php
// +----------------------------------------------------------------------
// 2017-8-23 09:03:40
// 此次修改为只作为websocket的服务端
// +----------------------------------------------------------------------
class Server{
    
    
    protected $swoole;
    // 监听所有地址
    protected $host = '0.0.0.0';
    // 监听 9501 端口
    protected $port = 9501;
    // 配置项
    protected $option = [
        //设置启动的worker进程数
        'worker_num' => 2,
        //task进程的数量
        'task_worker_num' => 4,
        //指定task任务使用消息队列模式,3表示完全争抢模式,task进程会争抢队列,无法使用定向投递
        'task_ipc_mode' => 3,
        //task进程的最大任务数
        'task_max_request' => 1000,
        // 守护进程化
        'daemonize'  => false,
        // 监听队列的长度
        'backlog'    => 128,
        //绑定uid时用
        'dispatch_mode' => 5,
        //设置日志路径
        'log_file' => SWOOLE_LOG_PATH,
    ];
    protected function init(){
    
    
        //异步非阻塞多进程的websocket
        $this->swoole = new swoole_websocket_server($this->host, $this->port);
        $eventList    = ['Open', 'Message', 'Close', 'HandShake' , 'Task', 'Finish' , 'WorkerStart' , 'Receive'];

        // 设置参数
        if (!empty($this->option)) {
            $this->swoole->set($this->option);
        }
        // 设置回调
        foreach ($eventList as $event) {
            if (method_exists($this, 'on' . $event)) {
                $this->swoole->on($event, [$this, 'on' . $event]);
            }
        }
    }
    public function start
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值