关于 在其他框架中调用workerman推送消息给客户端 的这段代码,有些疑问

young8704

https://wenda.workerman.net/question/508 这个问答里面有详细解答 “如何在其他框架中调用workerman推送消息给客户端”,在push.php里面有几个疑问。

问题一:为什么要使用全局变量global $worker,直接用$this不是更香吗?
问题二:为啥有些位置不需要全局变量global $worker,有些位置却要用?
问题三:$inner_text_worker本身只在本机内部通信使用,使用127.0.0.1本地回环,代替0.0.0.0,岂不是更安全更好?

我在有疑问的位置注释了,麻烦解答一下。

use Workerman\Worker;
require_once './Workerman/Autoloader.php';

global $worker;
$worker = new Worker('websocket://0.0.0.0:1234');
$worker->count = 1;

$worker->onWorkerStart = function($worker){
    //使用127.0.0.1本地回环,代替0.0.0.0,岂不是更安全更好???????????
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
    $inner_text_worker->onMessage = function($connection, $buffer){
        global $worker;//这里面用不上$worker,全局引入作什么用??????????????????????????
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        $ret = sendMessageByUid($uid, $data['percent']);
        $connection->send($ret ? 'ok' : 'fail');
    };
    $inner_text_worker->listen();
};

$worker->uidConnections = array();
$worker->onMessage = function($connection, $data)use($worker){
    // 为什么这里没引入全局变量 global $worker ,而下面的onClose却有加???为什么不直接用$this?????????
    if(!isset($connection->uid)){
        $connection->uid = $data;
        $worker->uidConnections[$connection->uid] = $connection;
        return;
    }
};

$worker->onClose = function($connection)use($worker){
    global $worker;  // 为什么不直接用$this????????????????????????????????????
    if(isset($connection->uid)){
        unset($worker->uidConnections[$connection->uid]);
    }
};
1765 2 0
2个回答

blogdaren

问题一:$this指的是当前对象本身,演示代码onClose回调采用的是匿名回调,怎么用$this呢?当然了并不是说不能用$this,要看你代码部署实现方式,比如把匿名函数绑定到特定的对象身上或者以纯粹的OOP思想部署实现代码;
问题二:老大那么写了并不意味着一定非要使用 global $worker,因为有时候代码只是个演示代码,有些细节自己按需调整,需要的就这么写,不需要的就不要写了;另外即便是这么写,如果匿名函数使用了use($worker),此时也不需要global $worker;
问题三:这个同样并不是说非得是127.0.0.1或者是0.0.0.0或者内网段,理论上都可以,按需而来,按实际场景需求而来;只不过大部分时候针对的是内部推送,所以一般多是127.0.0.1或者内网IP段;

  • 暂无评论
young8704

多谢解释。我基础不够扎实,见笑了

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