赞
踩
我服务器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 里边新建)
<?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 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)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。