我服务器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
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
3.在push/controller模块新增服务处理类(在 根目录/application 里边新建)
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 onError($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 onError($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
需要更换下图地址为0.0.0.0或者127.0.0.1,原因是由于你的服务器的外网ip实际上不属于你这台服务器,这个ip实际上类似一个代理设备,客户端发的请求先到这个代理上,然后转发到你的真实服务器。由于这个ip不属于你这台服务器,所以监听不了,启动会报错。阿里云,腾讯云等等比较常见
具体可以参考下图进行配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1LayoYg-1616486108799)(https://z3.ax1x.com/2021/03/23/67GmfP.png#pic_center)]