windows下,同一台机器中有多个gateway程序,多个Worker/或者共用同一个Worker【start.bat要有多个】

MyLover

如题,同一台机器中有:项目一 -> 使用gateway,一个start1.bat;项目二 -> 使用gateway,第二个start2.bat。
运行 start1.bat 测试项目一的时候正常,同时运行 start2.bat 测试项目二时,就会报错
“SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready”
Applications/App/Config/Store.php 中更改 public static $driver = self::DRIVER_REDIS 又会报错 class redis 不存在
PHP Fatal error: Class 'Redis' not found in D:\···\Server\Gatewa yWorker\Lib\StoreDriver\Redis.php on line 21

windows下如果需要同时运行多个gateway程序的话,需要做哪些修改呢?

4819 9 0
9个回答

walkor

两个项目 Config/Store.php 配置不要冲突即可

  • 暂无评论
MyLover

Applications/项目一/Config/Store.php

class Store
{
    // 使用文件存储,注意使用文件存储无法支持workerman分布式部署
    const DRIVER_FILE = 1;
    // 使用memcache存储,支持workerman分布式部署
    const DRIVER_MC = 2;
    // 使用redis存储(推荐),支持workerman分布式部署
    const DRIVER_REDIS = 3;

     // DRIVER_FILE 或者 DRIVER_MC 或者 DRIVER_REDIS(推荐)
    public static $driver = self::DRIVER_FILE;

    //$driver为DRIVER_MC/DRIVER_REDIS时需要配置memcached/redis服务端ip和端口
    public static $gateway = array(
        '127.0.0.1:6378',
    );

    // $driver为DRIVER_FILE时要配置此项,实际配置在最下面一行
    public static $storePath = '';
}

// 实际在这里配置的Store::$storePath ,默认为临时目录
Store::$storePath = sys_get_temp_dir().'/TmpZP/';

Applications/项目二/Config/Store.php

class Store
{
    // 使用文件存储,注意使用文件存储无法支持workerman分布式部署
    const DRIVER_FILE = 1;
    // 使用memcache存储,支持workerman分布式部署
    const DRIVER_MC = 2;
    // 使用redis存储(推荐),支持workerman分布式部署
    const DRIVER_REDIS = 3;

     // DRIVER_FILE 或者 DRIVER_MC 或者 DRIVER_REDIS(推荐)
    public static $driver = self::DRIVER_FILE;

    //$driver为DRIVER_MC/DRIVER_REDIS时需要配置memcached/redis服务端ip和端口
    public static $gateway = array(
        '127.0.0.1:6379',
    );

    // $driver为DRIVER_FILE时要配置此项,实际配置在最下面一行
    public static $storePath = '';
}

// 实际在这里配置的Store::$storePath ,默认为临时目录
Store::$storePath = sys_get_temp_dir().'/TmpSSL/';

这样的配置有问题么?也还是会报错的。。。而且两个里面,项目一的客户端连接时会在项目二的start.bat里面显示已连接,应该是要在项目一的start.bat里面显示已连接的

  • 暂无评论
walkor

看下项目二的businessworker启动了没
贴下两个项目的启动截面吧

  • 暂无评论
MyLover

两个项目 bat 启动界面截图

  • 暂无评论
MyLover

呃,这个····没法解决么

  • 暂无评论
walkor

贴下两个项目
gateway 启动的代码

  • 暂无评论
MyLover

两个项目gateway启动代码:
一:

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

// 自动加载类
require_once __DIR__ . '/../../Workerman/Autoloader.php';
Autoloader::setRootPath(__DIR__);

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

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

二:

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

// 自动加载类
require_once __DIR__ . '/../../Workerman/Autoloader.php';
Autoloader::setRootPath(__DIR__);

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

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

两个文件中,基本上除了端口不一样,其他都一样的。。。

  • 暂无评论
walkor

$gateway->startPort = 2300;
不要配置成一样

MyLover

$gateway->startPort = 2300;
改成不同,可行,谢谢~

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