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