kbim-dev / yii2-socketio
为Yii2框架提供的简单而强大的socketio
1.3.1
2018-10-30 12:49 UTC
Requires
- liyunfang/yii2-widget-linkpager: *
- yiisoft/yii2: ~2.0.8
This package is not auto-updated.
Last update: 2024-09-29 04:43:18 UTC
README
在您的Yii 2项目中使用socket.io的全部功能。
配置
安装node + 其他npm依赖
cd ~ curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh sudo bash nodesource_setup.sh cd vendor/yiicod/yii2-soketio/server npm install
控制台配置
'controllerMap' => [ 'socketio' => [ 'class' => \yiicod\socketio\commands\SocketIoCommand::class, 'server' => 'localhost:1367', 'yiiAlias' => '@app' // If you use advanced structure you should use '@app/..' ], ]
启动socketio服务器
php yii socketio/start
停止socketio服务器
php yii socketio/stop
或者使用pm2(https://pm2.node.org.cn/)。PM2是一个强大的进程管理器。以这种方式使用socketio是最佳实践。
'controllerMap' => [ 'socketio' => [ 'class' => \yiicod\socketio\commands\WorkerCommand::class, 'server' => 'localhost:1367' 'yiiAlias' => '@app' // If you use advanced structure you should use '@app/..' ], ]
pm2配置
{ "apps": [ { "name": "socket-io-node-js-server", "script": "yii", "args": [ "socketio/node-js-server" ], "exec_interpreter": "php", "exec_mode": "fork_mode", "max_memory_restart": "1G", "watch": false, "merge_logs": true, "out_file": "runtime/logs/node_js_server_out.log", "error_file": "runtime/logs/node_js_server_err.log" }, { "name": "socket-io-php-server", "script": "yii", "args": [ "socketio/php-server" ], "exec_interpreter": "php", "exec_mode": "fork_mode", "max_memory_restart": "1G", "watch": false, "merge_logs": true, "out_file": "runtime/logs/php_server_out.log", "error_file": "runtime/logs/php_server_err.log" }, ] }
运行PM2守护进程
pm2 start daemons-app.json
PM2将在后台运行以下两个命令:
php yii socketio/node-js-server php yii socketio/php-server
通用配置
'components' =>[ 'broadcastEvents' => [ 'class' => \yiicod\socketio\EventManager::class, 'nsp' => 'some_unique_key', // Namespaces with events folders 'namespaces' => [ 'app\socketio', ] ], 'broadcastDriver' => [ 'class' => \yiicod\socketio\drivers\RedisDriver::class, 'hostname' => 'localhost', 'port' => 6379, ], ]
从服务器创建发布者到客户端
use yiicod\socketio\events\EventInterface; use yiicod\socketio\events\EventPubInterface; class CountEvent implements EventInterface, EventPubInterface { /** * Changel name. For client side this is nsp. */ public static function broadcastOn(): array { return ['notifications']; } /** * Event name */ public static function name(): string { return 'update_notification_count'; } /** * Emit client event * @param array $data * @return array */ public function fire(array $data): array { return $data; } }
var socket = io('localhost:1367/notifications'); socket.on('update_notification_count', function(data){ console.log(data) });
//Run broadcast to client \yiicod\socketio\Broadcast::emit(CountEvent::name(), ['count' => 10])
从客户端创建接收者到服务器
use yiicod\socketio\events\EventInterface; use yiicod\socketio\events\EventSubInterface; class MarkAsReadEvent implements EventInterface, EventSubInterface { /** * Changel name. For client side this is nsp. */ public static function broadcastOn(): array { return ['notifications']; } /** * Event name */ public static function name(): string { return 'mark_as_read_notification'; } /** * Emit client event * @param array $data * @return array */ public function handle(array $data) { // Mark notification as read // And call client update // Broadcast::emit('update_notification_count', ['some_key' => 'some_value']); // Push some log file_put_contents(\Yii::getAlias('@app/../file.txt'), serialize($data)); } }
var socket = io('localhost:1367/notifications'); socket.emit('mark_as_read_notification', {id: 10});
您可以在一个事件中同时拥有发布者和接收者。如果您需要检查从客户端到服务器的数据,您应该使用
- EventPolicyInterface
带有从客户端到服务器检查的接收者
use yiicod\socketio\events\EventSubInterface; use yiicod\socketio\events\EventInterface; use yiicod\socketio\events\EventPolicyInterface; class MarkAsReadEvent implements EventInterface, EventSubInterface, EventPolicyInterface { /** * Changel name. For client side this is nsp. */ public static function broadcastOn(): array { return ['notifications']; } /** * Event name */ public static function name(): string { return 'mark_as_read_notification'; } public function can($data): bool { // Check data from client return true; } /** * Emit client event * @param array $data * @return array */ public function handle(array $data) { // Mark notification as read // And call client update Broadcast::emit('update_notification_count', ['some_key' => 'some_value']); } }
Soket.io有房间功能。如果您需要,您应该实现
- EventRoomInterface
use yiicod\socketio\events\EventPubInterface; use yiicod\socketio\events\EventInterface; use yiicod\socketio\events\EventRoomInterface; class CountEvent implements EventInterface, EventPubInterface, EventRoomInterface { /** * Changel name. For client side this is nsp. */ public static function broadcastOn(): array { return ['notifications']; } /** * Event name */ public static function name(): string { return 'update_notification_count'; } /** * Socket.io room * @return string */ public function room(): string { return md5('notifications' . 'room-1'); } /** * Emit client event * @param array $data * @return array */ public function fire(array $data): array { return [ 'count' => 10, ]; } }
var socket = io('localhost:1367/notifications'); socket.emit('join', {room: 'room-1'}); // Now you will receive data from 'room-1' socket.on('update_notification_count', function(data){ console.log(data) }); // You can leave room socket.emit('leave');