https://wenda.workerman.net/question/508 這個問答里面有詳細解答 “如何在其他框架中調(diào)用workerman推送消息給客戶端”,在push.php里面有幾個疑問。
問題一:為什么要使用全局變量global $worker,直接用$this不是更香嗎?
問題二:為啥有些位置不需要全局變量global $worker,有些位置卻要用?
問題三:$inner_text_worker本身只在本機內(nèi)部通信使用,使用127.0.0.1本地回環(huán),代替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本地回環(huán),代替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回調(diào)采用的是匿名回調(diào),怎么用$this呢?當然了并不是說不能用$this,要看你代碼部署實現(xiàn)方式,比如把匿名函數(shù)綁定到特定的對象身上或者以純粹的OOP思想部署實現(xiàn)代碼;
問題二:老大那么寫了并不意味著一定非要使用 global $worker,因為有時候代碼只是個演示代碼,有些細節(jié)自己按需調(diào)整,需要的就這么寫,不需要的就不要寫了;另外即便是這么寫,如果匿名函數(shù)使用了use($worker),此時也不需要global $worker;
問題三:這個同樣并不是說非得是127.0.0.1或者是0.0.0.0或者內(nèi)網(wǎng)段,理論上都可以,按需而來,按實際場景需求而來;只不過大部分時候針對的是內(nèi)部推送,所以一般多是127.0.0.1或者內(nèi)網(wǎng)IP段;