ThinkPHP 5.0 + Workerman 保姆教程 以及常见问题

我服务器linux系统所以本片文章以Linux系统为主,windows系统可以到workeman官方论坛寻找问题。

ThinkPHP 5.0 的官方手册写的workeman模糊不清,导致人会遇到各式各样的问题。

Workerman
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。基于workerman开发者可以更专注于业务逻辑开发,不必再为PHP Socket底层开发而烦恼。

1.首先通过 composer 安装(这里需要根据tp版本号和workerman版本号来安装,官方文档有点不清楚;我的是fastadmin,用的是tp5.0.24版本,只能安装1.0版本扩展)


composer require topthink/think-worker
//直接在终端执行如果报错是tinkphp版本过低 (很多通过宝塔面板安装的)
//我们使用下方代码执行
composer require topthink/think-worker=1.0.*

2.新增启动服务文件server.php,在项目根目录;(就是在thinkphp目录里边新建一个php文件)

#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

3.在push/controller模块新增服务处理类(在 根目录/application 里边新建)
ThinkPHP 5.0 + Workerman 保姆教程 以及常见问题

<?php

namespace app\push\controller;

use think\worker\Server;

class Worker extends Server
{
    protected $socket = 'websocket://push.app:2346';

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        $connection->send('我收到你的信息了');
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

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

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

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

    }
}


send('我收到你的信息了');
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

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

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

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

    }
}
 

4.在命令行下运行,启动监听服务

首先连接到终端,cd跳转到项目根目录(也就是server.php所在的目录)

php server.php start //测试时启动方式 会自动关闭

php server.php start -d //上线时使用此方法启动

错误总结

一般启动时候会遇到很多问题,上边基本不会出现问题,当执完第4部报错,请先检查php函数是否被禁止

//使用workerman需要解除以下函数的禁用

stream_socket_server
stream_socket_client
pcntl_signal_dispatch
pcntl_signal
pcntl_alarm
pcntl_fork
posix_getuid
posix_getpwuid
posix_kill
posix_setsid
posix_getpid
posix_getpwnam
posix_getgrnam
posix_getgid
posix_setgid
posix_initgroups
posix_setuid
posix_isatty

出现cannot assign requested address
ThinkPHP 5.0 + Workerman 保姆教程 以及常见问题

需要更换下图地址为0.0.0.0或者127.0.0.1,原因是由于你的服务器的外网ip实际上不属于你这台服务器,这个ip实际上类似一个代理设备,客户端发的请求先到这个代理上,然后转发到你的真实服务器。由于这个ip不属于你这台服务器,所以监听不了,启动会报错。阿里云,腾讯云等等比较常见
ThinkPHP 5.0 + Workerman 保姆教程 以及常见问题

具体可以参考下图进行配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1LayoYg-1616486108799)(https://z3.ax1x.com/2021/03/23/67GmfP.png#pic_center)]

上一篇:TP5——workerman在线客服-长连接绑定用户id实现实现一对一客服聊天


下一篇:基于Centos搭建 Hadoop 伪分布式环境