Cannot assign requested address

朱小明

请问这下面说的修改启动文件的ip,是哪个启动文件?PHP Warning:  stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in /home/GatewayWorker/Workerman/Worker.php on line xxxx
关键字:Cannot assign requested address
失败原因:
启动脚本ip参数写错,不是本机ip,请填写本机ip机或者填写 0.0.0.0(表示监听本机所有ip)即可解决。
提示:Linux系统可以通过命令 ifconfig查看本机所有网卡ip。

如果您是腾讯云用户,注意您的公网ip实际是代理服务器ip,公网ip并不属于你的服务器,所以无法通过公网ip绑定,但是可以通过0.0.0.0来绑定。

5064 1 0
1个回答

phpcreeper

1、启动文件都是自己编写的,名字随每个人的喜好而定,所以到底是哪个启动文件,这得看自己定的什么了。
2、一般默认的入口启动文件就是 /path/to/start.php 
3、最笨办法:启动文件都是有特点的,你看下官方启动文件长什么样,就知道自己的启动文件是什么了。 
4、服务端要监听的IP就是比如  new Worker("tcp://x.x.x.x:8888") 中的  x.x.x.x

  • 朱小明 2018-12-24

    我是直接在网上下载的GatewayWorker文件夹,我是在Event.php文件做逻辑判断的,其次就是修改了start_businessworker和start_gateway的服务注册地址为0.0.0.0:1238,start_register的text协议为Linux服务器的ip。默认的启动文件的代码:
    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();

  • phpcreeper 2018-12-24

    @5023:
    1、start_.php 针对不同服务的局部的独立启动文件;
    2、start.php 则是全局的启动文件,用来一次性启动 start_
    .php 所对应的所有相关服务;

  • 朱小明 2018-12-24

    谢谢,终于明白start.php 的作用了

  • 朱小明 2018-12-24

    但是我按照他们的文件操作,我的系统是Linux的,会报错:Register auth timeout (127.0.0.1). See http://wiki.workerman.net/Error4 for detail

  • phpcreeper 2018-12-24

    @5023: 不客气

  • 朱小明 2018-12-24

    但是我按照他们的文件操作,系统是Linux的,会报错:Register auth timeout (127.0.0.1). See http://wiki.workerman.net/Error4 for detail

  • phpcreeper 2018-12-24

    @5023: http://wiki.workerman.net/Error4 原因说的很清楚啊

  • 朱小明 2018-12-25

    请问我在没注册GatewayWorker之前,MySQL连接操作是没问题的,但是注册之后就出现连接超时了。
    PDOException: SQLSTATE[HY000] [2002] Connection timed out in /home/www/chaobiao. aa.top/mysql-master/src/Connection.php:1711

  • phpcreeper 2018-12-25

    @5023: 什么是没注册 GatewayWorker 之前? 没听懂, 最好能贴下样板代码。

  • zhouciming 2018-12-26

    昨天看了下Worker的源码,发现一个启动文件中不支持多个Worker实例,为什么会这样?

  • phpcreeper 2018-12-26

    @622: 是你理解错了吧,一直都支持。

  • zhouciming 2018-12-26

    @614:不好意思,我昨天看的是这段代码,似乎是windows版本会这样!你看看:

    /**
     * Fork some worker processes.
     *
     * @return void
     */
    protected static function forkWorkersForWindows()
    {
        $files = static::getStartFilesForWindows();
        global $argv;
        if(in_array('-q', $argv) || count($files) === 1)
        {
            if(count(static::$_workers) > 1)
            {
                static::safeEcho("@@@ Error: multi workers init in one php file are not support @@@\r\n");
                static::safeEcho("@@@ Please visit http://wiki.workerman.net/Multi_woker_for_win @@@\r\n");
            }
            elseif(count(static::$_workers) <= 0)
            {
                exit("@@@no worker inited@@@\r\n\r\n");
            }
    
            reset(static::$_workers);
            /** @var Worker $worker */
            $worker = current(static::$_workers);
    
            // Display UI.
            static::safeEcho(str_pad($worker->name, 21) . str_pad($worker->getSocketName(), 36) . str_pad($worker->count, 10) . "[ok]\n");
            $worker->listen();
            $worker->run();
            exit("@@@child exit@@@\r\n");
        }
        else
        {
            static::$globalEvent = new \Workerman\Events\Select();
            Timer::init(static::$globalEvent);
            foreach($files as $start_file)
            {
                static::forkOneWorkerForWindows($start_file);
            }
        }
    }
  • phpcreeper 2018-12-26

    @622: 我不玩windows, 针对window平台的实现这块儿不了解,所以不敢妄言。

  • zhouciming 2018-12-27

    @614:我也不玩windows,仅从这源码来看,
    if(count(static::$_workers) > 1)
    {
    static::safeEcho("@@@ Error: multi workers init in one php file are not support @@@\r\n");
    static::safeEcho("@@@ Please visit http://wiki.workerman.net/Multi_woker_for_win @@@\r\n");
    }

    这里有个明显的打印,接下去
    reset(static::$_workers);
    /* @634 Worker $worker /
    $worker = current(static::$_workers);

    这是仅启动一个worker!

  • phpcreeper 2018-12-28

    1、workerman 针对Linux 和 Windows在进程控制方面的实现是完全不同的,Linux上版的workerman是基于pcntl_ 以及 posix_ 扩展系列实现的多进程以及信号编程,而Windows版的workerman是不支持这些扩展的,换句话 Windows版的workerman 是纯单进程模型。
    2、从针对windows的源码实现来看,一个启动文件确实不能启动多个worker实例,利用的proc_open() 机制启动的单进程模型,所以才有了命令行同时启动多个文件来达到启动多个实例这档子事,比如: php a.php b.php .....; 此外我们也能发现 windows版的workerman 也不支持守护进程、不支持start stop....等等命令,这都是因为条款1的原因,当然也不排除可能有其他发方式可以实现,至少目前Windows版本的workerman是不支持Linux版的很多高级特性的。

年代过于久远,无法发表回答
×
🔝