首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket多进程之间无法共享连接
本人新接触swoole,就在前两天下载的swoole_framework框架,使用其中的例子websocket_server.php 核心代码如下 define('DEBUG', 'on'); define("WEBPATH", str_replace("\\","/", __DIR__)); require __DIR__ . '/../libs/lib_config.php'; class WebSocket extends Swoole\Protocol\WebSocket { protected $message; /** * 下线时,通知所有人 */ function onExit($client_id) { //将下线消息发送给所有人 //$this->log("onOffline: " . $client_id); //$this->broadcast($client_id, "onOffline: " . $client_id); } /** * 接收到消息时 */ function onMessage($client_id, $ws) { $this->log("onMessage: ".$client_id.' = '.$ws['message']); $this->send($client_id, 'Server: '.$ws['message']); $this->broadcast($client_id,$ws['message']); } /** * 广播 */ function broadcast($client_id, $msg) { foreach ($this->connections as $clid => $info) { var_dump($clid); if ($client_id != $clid) { $this->send($clid, $msg); } } } } Swoole\Config::$debug = true; Swoole\Error::$echo_html = false; $AppSvr = new WebSocket(); $AppSvr->loadSetting(__DIR__."/swoole.ini"); //加载配置文件 $AppSvr->setLogger(new \Swoole\Log\EchoLog(true)); //Logger $enable_ssl = false; $server = Swoole\Network\Server::autoCreate('0.0.0.0', 9443, $enable_ssl); $server->setProtocol($AppSvr); $server->run(array( 'worker_num' => 4, 'max_request' => 1000, )); 在广播函数内,会每次都打印当前所有连接;但是只要开启的worker_num大于1,则会出现,某个worker只能打印出当前连接到它的连接,无法打印出连接在其他worker上的连接;比如开启了2个worker_num;打开网页,连接进来之后,打印出连接1;再打开一个网页,打印出连接2;按说应该打印出连接1,连接2 才对;不知道哪里需要修改或者设置才可以。 如果不依托框架,自己创建websocket server 则不会出现上述问题;每个进程都是可以打印出当前所有的连接的;大致代码如下: define('DEBUG', 'on'); define("WEBPATH", str_replace("\\","/", __DIR__)); require __DIR__ . '/libs/lib_config.php'; class Server{ public $serv; public function __construct() { $this->serv = new swoole_websocket_server("0.0.0.0", 9501); $this->serv->set(array( 'worker_num' => 8, 'daemonize' => false, 'max_request' => 10000, //'dispatch_mode' => 2, 'debug_mode'=> 1, //'task_worker_num' => 8 )); $this->serv->on('Open', array($this,"onOpen")); $this->serv->on('Message', array($this,"onMessage")); $this->serv->on('Close', array($this,"onClose")); $this->serv->start(); } function onOpen($server, $req){ echo "connection open: ".$req->fd."\n"; } function onMessage($server, $frame){ echo $frame->fd." send message: ".$frame->data."\n"; $server->push($frame->fd, jsonReturn(1, 'OK', time()." message is : ".$frame->data)); $this->broad(); } } function onClose($server, $fd){ echo "connection close: ".$fd."\n"; } //广播 function broad($fd,$msg){ foreach ($this->serv->connections as $k=>$v){ var_dump($k); } } } Swoole\Config::$debug = true; Swoole\Error::$echo_html = false; $server = new Server(); 求大神来解答下
发布于8年前 · 3 次浏览 · 来自
提问
a
agoni
本人新接触swoole,就在前两天下载的swoole_framework框架,使用其中的例子websocket_server.php 核心代码如下 define('DEBUG', 'on'); define("WEBPATH", str_replace("\\","/", __DIR__)); require __DIR__ . '/../libs/lib_config.php'; class WebSocket extends Swoole\Protocol\WebSocket { protected $message; /** * 下线时,通知所有人 */ function onExit($client_id) { //将下线消息发送给所有人 //$this->log("onOffline: " . $client_id); //$this->broadcast($client_id, "onOffline: " . $client_id); } /** * 接收到消息时 */ function onMessage($client_id, $ws) { $this->log("onMessage: ".$client_id.' = '.$ws['message']); $this->send($client_id, 'Server: '.$ws['message']); $this->broadcast($client_id,$ws['message']); } /** * 广播 */ function broadcast($client_id, $msg) { foreach ($this->connections as $clid => $info) { var_dump($clid); if ($client_id != $clid) { $this->send($clid, $msg); } } } } Swoole\Config::$debug = true; Swoole\Error::$echo_html = false; $AppSvr = new WebSocket(); $AppSvr->loadSetting(__DIR__."/swoole.ini"); //加载配置文件 $AppSvr->setLogger(new \Swoole\Log\EchoLog(true)); //Logger $enable_ssl = false; $server = Swoole\Network\Server::autoCreate('0.0.0.0', 9443, $enable_ssl); $server->setProtocol($AppSvr); $server->run(array( 'worker_num' => 4, 'max_request' => 1000, )); 在广播函数内,会每次都打印当前所有连接;但是只要开启的worker_num大于1,则会出现,某个worker只能打印出当前连接到它的连接,无法打印出连接在其他worker上的连接;比如开启了2个worker_num;打开网页,连接进来之后,打印出连接1;再打开一个网页,打印出连接2;按说应该打印出连接1,连接2 才对;不知道哪里需要修改或者设置才可以。 如果不依托框架,自己创建websocket server 则不会出现上述问题;每个进程都是可以打印出当前所有的连接的;大致代码如下: define('DEBUG', 'on'); define("WEBPATH", str_replace("\\","/", __DIR__)); require __DIR__ . '/libs/lib_config.php'; class Server{ public $serv; public function __construct() { $this->serv = new swoole_websocket_server("0.0.0.0", 9501); $this->serv->set(array( 'worker_num' => 8, 'daemonize' => false, 'max_request' => 10000, //'dispatch_mode' => 2, 'debug_mode'=> 1, //'task_worker_num' => 8 )); $this->serv->on('Open', array($this,"onOpen")); $this->serv->on('Message', array($this,"onMessage")); $this->serv->on('Close', array($this,"onClose")); $this->serv->start(); } function onOpen($server, $req){ echo "connection open: ".$req->fd."\n"; } function onMessage($server, $frame){ echo $frame->fd." send message: ".$frame->data."\n"; $server->push($frame->fd, jsonReturn(1, 'OK', time()." message is : ".$frame->data)); $this->broad(); } } function onClose($server, $fd){ echo "connection close: ".$fd."\n"; } //广播 function broad($fd,$msg){ foreach ($this->serv->connections as $k=>$v){ var_dump($k); } } } Swoole\Config::$debug = true; Swoole\Error::$echo_html = false; $server = new Server(); 求大神来解答下
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2017-12-09
R
Run
使用MySQL、Redis、Swoole\Table、APCu等方式来实现。
赞
0
回复
2017-12-15
鹏
鹏
纠结好久 终于解决了
赞
0
回复