Thinkphp5使用WorkerMan启动GatewayWorker失败,没有报错也无法正常启动

文章讲述了在ThinkPHP5框架中使用GatewayWorker实现WebSocket即时通讯时遇到的启动失败问题。作者通过检查代码和配置,发现是由于目录名错误和PHP版本导致的自动加载问题。修正了目录名并调整自动加载类的路径后,成功解决了问题。
摘要由CSDN通过智能技术生成

遇到问题

确定GatewayWorker已经成功安装到tp5框架中
ThinkPHP5使用WorkerMan的GatewayWorker实现websocket即时通讯功能
一切准备就绪后,运行的结果:
运行结果
开启失败,日志也没有任何报错,想了很久觉得配置也没有问题,重新安装了一遍运行后还是这个结果

解决方案

从源头找问题,vendor里的文件是不需要动的,所以问题只能在start.php或者三个开启服务的文件内了,最后发现问题在start.php文件内

<?php
/**
 * run with command
 * php start.php start
 */
 
ini_set('display_errors', 'on');
use Workerman\Worker;
 
if(strpos(strtolower(PHP_OS), 'win') === 0)
{
    exit("start.php not support windows, please use start_for_win.bat\n");
}
 
// 检查扩展
if(!extension_loaded('pcntl'))
{
    exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
 
if(!extension_loaded('posix'))
{
    exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
 
// 标记是全局启动
define('GLOBAL_START', 1);
 
require_once __DIR__ . '/vendor/autoload.php';
 
// 加载所有Applications/*/start.php,以便启动所有服务
foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
    require_once $start_file;
}
// 运行所有服务
Worker::runAll();

官方给的代码看起来没有毛病,这个文件就是遍历加载Application目录内的所有以start开头的php文件,然后运行服务,仔细想了想,对着文件内的代码过了几遍,发现这个地方不太对
start.php代码

找到问题

我的项目内的目录名没有Applications,而是application,看来问题出在了这里,目录名都不对,引入的文件都没有找到,怎么可能遍历加载成功呢?
修改后
start.php修改后的代码
重新进入终端,进入项目根目录,运行后发现会报错,三个start文件出了问题,我的php版本是7.4.3,可能是版本原因,出现了这些报错,源码为:

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';

// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("tcp://0.0.0.0:8282");
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';

// 心跳间隔
//$gateway->pingInterval = 10;
// 心跳数据
//$gateway->pingData = '{"type":"ping"}';

/* 
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
}; 
*/

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

解决方法

就是自动加载类出现了问题,引入文件的路径 并没有找到对应的文件,修改后

// 自动加载类
require_once '/www/wwwroot/schoolerrand.qaz741.work/vendor/autoload.php';

这样就解决了,重新运行后,问题解决了

解决问题后的运行结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值