SendBufferToWorker fail. 报错

轩辕磊
<?php
namespace app\index\controller;

use Workerman\Worker;
use GatewayWorker\Gateway;
use Workerman\Autoloader;

class Sgateway{
    public function __construct(){
        // gateway 进程
        $gateway = new Gateway("Websocket://0.0.0.0:7272");
        // 设置名称,方便status时查看
        $gateway->name = 'ChatGateway';
        // 设置进程数,gateway进程数建议与cpu核数相同
        $gateway->count = 4;
        // 分布式部署时请设置成内网ip(非127.0.0.1)
        $gateway->lanIp = '127.0.0.1';
        // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
        // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
        $gateway->startPort = 2300;
        // 心跳间隔
        $gateway->pingInterval = 10;
        // 心跳数据
        $gateway->pingData = '{"type":"ping"}';
        // 服务注册地址
        $gateway->registerAddress = '127.0.0.1:1236';

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

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

    }
}

<?php
namespace app\index\controller;

use Workerman\Worker;
use GatewayWorker\Register;

class Sregister{

    public function __construct(){
        // register 服务必须是text协议
        $register = new Register('text://0.0.0.0:1236');

        // 如果不是在根目录启动,则运行runAll方法
        if(!defined('GLOBAL_START'))
        {
            Worker::runAll();
        }
    }
}
<?php
namespace app\index\controller;

use Workerman\Worker;
use GatewayWorker\BusinessWorker;
use Workerman\Autoloader;

class Sbusinessworker{
    public function __construct(){
        // bussinessWorker 进程
        $worker = new BusinessWorker();
        // worker名称
        $worker->name = 'ChatBusinessWorker';
        // bussinessWorker进程数量
        $worker->count = 4;
        // 服务注册地址
        $worker->registerAddress = '127.0.0.1:1236';
        //设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = 'app\index\controller\Events';

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

以上是三个PHP 文件代码

启动没有问题,但是在页面上连接websocket就报错
报错信息
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://wiki.workerman.net/Error3 for detail

我不知道自己的代码哪里写错!请大神帮忙看一下!

2604 5 0
5个回答

walkor

截图启动界面以及 php start.php status 的结果

  • 轩辕磊 2019-06-11

    您看一下,我把结构以及代码都发出来了!

轩辕磊

[attach]2151[/attach]
直接运行start_for_win.bat脚本没有问题
脚本里面内容 php start_register.php start_gateway.php start_businessworker.phppause
 
HTML页面上连接websocket时报错

[attach]2153[/attach]
 
 
项目的目录结构

[attach]2152[/attach]
 
 
上面的代码对应的就这几个控制器

  • 暂无评论
walkor

Events.php的内容截图下

  • 轩辕磊 2019-06-11

    <?php
    namespace app\index\controller;

    /**

    • 用于检测业务代码死循环或者长时间阻塞等问题
    • 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
    • 然后观察一段时间workerman.log看是否有process_timeout异常
      */
      //declare(ticks=1);

    /**

    • 聊天主逻辑
    • 主要是处理 onMessage onClose
      */
      use \GatewayWorker\Lib\Gateway;

    class Events
    {
    /**

    • 有消息时
    • @param int $client_id
    • @param mixed $message
      */
      public static function onMessage($client_id, $message)
      {
      // debug
      echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n";

      // 客户端传递的是json数据
      $message_data = json_decode($message, true);
      if(!$message_data)
      {
          return ;
      }
      
      // 根据类型执行不同的业务
      switch($message_data['type'])
      {
          // 客户端回应服务端的心跳
          case 'pong':
              return;
          // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室
          case 'login':
              // 判断是否有房间号
              if(!isset($message_data['room_id']))
              {
                  throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
              }
      
              // 把房间号昵称放到session中
              $room_id = $message_data['room_id'];
              $client_name = htmlspecialchars($message_data['client_name']);
              $_SESSION['room_id'] = $room_id;
              $_SESSION['client_name'] = $client_name;
      
              // 获取房间内所有用户列表 
              $clients_list = Gateway::getClientSessionsByGroup($room_id);
              foreach($clients_list as $tmp_client_id=>$item)
              {
                  $clients_list[$tmp_client_id] = $item['client_name'];
              }
              $clients_list[$client_id] = $client_name;
      
              // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} 
              $new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
              Gateway::sendToGroup($room_id, json_encode($new_message));
              Gateway::joinGroup($client_id, $room_id);
      
              // 给当前用户发送用户列表 
              $new_message['client_list'] = $clients_list;
              Gateway::sendToCurrentClient(json_encode($new_message));
              return;
      
          // 客户端发言 message: {type:say, to_client_id:xx, content:xx}
          case 'say':
              // 非法请求
              if(!isset($_SESSION['room_id']))
              {
                  throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}");
              }
              $room_id = $_SESSION['room_id'];
              $client_name = $_SESSION['client_name'];
      
              // 私聊
              if($message_data['to_client_id'] != 'all')
              {
                  $new_message = array(
                      'type'=>'say',
                      'from_client_id'=>$client_id, 
                      'from_client_name' =>$client_name,
                      'to_client_id'=>$message_data['to_client_id'],
                      'content'=>"<b>对你说: </b>".nl2br(htmlspecialchars($message_data['content'])),
                      'time'=>date('Y-m-d H:i:s'),
                  );
                  Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message));
                  $new_message['content'] = "<b>你对".htmlspecialchars($message_data['to_client_name'])."说: </b>".nl2br(htmlspecialchars($message_data['content']));
                  return Gateway::sendToCurrentClient(json_encode($new_message));
              }
      
              $new_message = array(
                  'type'=>'say', 
                  'from_client_id'=>$client_id,
                  'from_client_name' =>$client_name,
                  'to_client_id'=>'all',
                  'content'=>nl2br(htmlspecialchars($message_data['content'])),
                  'time'=>date('Y-m-d H:i:s'),
              );
              return Gateway::sendToGroup($room_id ,json_encode($new_message));
      }

      }

      /**

    • 当客户端断开连接时
    • @param integer $client_id 客户端id
      */
      public static function onClose($client_id)
      {
      // debug
      echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id onClose:''\n";

      // 从房间的客户端列表中删除
      if(isset($_SESSION['room_id']))
      {
      $room_id = $_SESSION['room_id'];
      $new_message = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$_SESSION['client_name'], 'time'=>date('Y-m-d H:i:s'));
      Gateway::sendToGroup($room_id, json_encode($new_message));
      }
      }

    }

walkor

看起来没问题,可能是包装了一层哪里影响到了

轩辕磊

[attach]2154[/attach]
 
我已经找到位置了,就是这个位置,但是我不知怎么引起的

  • 暂无评论
年代过于久远,无法发表回答
🔝