`on(``'connection'``,``function``(``$socket``){``//当客户端发送登录事件时触发``$socket``->on(``'登录'``,``功能``(``$uid``,``$group``,``$video_type``,``$video_id``)``use``(``$socket``){``global``$uidConnectionMap``,``$roomMap``,``$last_online_count``,``$last_online_page_count``,``$socketIoPort``;``//已经登录``if``(isset(``$socket``->uid)){``return``;``}``//更新uid对应的线上数据``$uid``=(string)``$uid``;``//哪个房间``$room``=``$video_type``.``$video_id``;``//哪个用户在哪个房间``$socket``->uid=``$room``.``'-'``.``$uid``;``if``(!isset(``$uidConnectionMap``[``$socket``->uid])){``$uidConnectionMap``[``$socket``->uid]=0;``}``if``(!isset(``$roomMap``[``$room``][``$uid``])){``$roomMap``[``$room``][``$uid``]=0;``}``//这个uid有++$uidConnectionMap[$uid]套接字连接``++``$uidConnectionMap``[``$socket``->uid];``++``$roomMap``[``$room``][``$uid``];``//保存到文件以便于查看``$file``=``'/tmp/logs/socket/'``.``$socketIoPort``.``'-'``.md5(``__FILE__``).``'.log'``;``if``(``file_exists``(``$file``)){``$contents``=@``file_get_contents``(``$file``);``}``else``{``$contents``=``''``;``}``$contents``.=``$socket``->uid.``"\n"``;``@``file_put_contents``(``$file``,``$contents``);``if``(!isset(``$last_online_count``[``$room``])){``$last_online_count``[``$room``]=0;``}``if``(!isset(``$last_online_page_count``[``$房间``])){``$最后_online_page_count``[``$room``]=0;``}``//将此连接添加到uid组,方便为uid推送数据``$socket``->join(``$uid``);``//Someone``$socket``->join(``$socket``->uid);``//有人在房间里``$socket``->join(``$room``);```//某个房间``$socket``->join(``$group``);``//分组,比如客服等``$socket``->to(``$room``)->emit(``'update_online_count'``,``"当前{$last_online_count[$room]}人在线,一共开启{$last_online_page_count[$room]}pages"``);``});``//客户端断开连接时触发(通常是关闭网页或跳转刷新引起)``$socket``->on(``'断开连接'``,``function``()``use``(``$socket``){``if``(!isset(``$socket``->uid)){``return``;``}``global``$uidConnectionMap``,``$sender_io``,``$socketIoPort``;``//减少uid的在线数量通过一个``if``(--``$uidConnectionMap``[``$socket``->uid]<=0){``unset(``$uidConnectionMap``[``$socket``->uid]);``}``//删除``$file``=``'/tmp/logs/socket/'``.``$socketIoPort``.``'-'``.md5(``__FILE__``).``'.log'``;``if``(``file_exists``(``$file``)){``$concontents``=@``file_get_contents``(``$file``);``if``(``is_string``(``$contents``)){``$arr``=``explode``(``"\n"``,``$contents``);``foreach``(``$arr``as``$k``=>``$v``){``if``(``$v``==``$socket``->uid){``unset(``$arr``[``$k``]);``}``}``$contents``=implode(``"\n"``,``$arr``);``@``file_put_contents``(``$file``,``$contents``);``}``}``else``{``$contents``=``''``;``}``@``file_put_contents``(``$file``,``$contents``);``});``});``//$sender_io启动时监听一个http端口,通过该端口可以向任意uid或所有uid发送数据``//是附加的关系,例如->to(1)->to(2),然后将消息推送到1和2``$sender_io``->on(``'workerStart'``,``function``(){``//监听一个http端口``$inner_http_worker``=``new``Worker(``'http://0.0.0.0:2132'``);``//当http客户端发送时触发data```$inner_http_worker``->onMessage=``function``(``$http_connection``,``$data``){``/**@var\Workerman\Connection\TcpConnection$http_connection*/``global``$uidConnectionMap``;``$_POST``=``$_POST``?``$_POST``:``$_GET``;``$video_type``=``$_POST``[``'video_type'``]=isset(``$_POST``[``'video_type'``])?``$_POST``[``'video_type'``]:``''``;``$video_id``=``$_POST``[``'video_id'``]=isset(``$_POST``[``'video_id'``])?``$_POST``[``'video_id'``]:``''``;``$room``=``$video_type``.``$video_id``;``//推送数据的url格式type=publish&to=uid&content=xxxx``require``__DIR__.``'/logic.php'``;``return``$http_connection``->send(``'fail'``);``};``//执行监听``$inner_http_worker``->listen();``//一个定时器,定时推送当前uid在线数和在线页码给所有uid``定时器::添加(1,``函数``(){``global``$uidConnectionMap``,``$roomMap``,``$sender_io``,``$last_online_count``,``$last_online_page_count``,``$use_id``;``foreach``(``$roomMap``as``$room``=>``$uids``){``$online_count_now``=``count``(``$uids``);``$online_page_count_now``=``array_sum``(``$uids``);``//只在客户端在线数变化时广播,减少客户端不必要的通信n``if``(``$last_online_count``[``$room``]!=``$online_count_now``||``$last_online_page_count``[``$room``]!=``$online_page_count_now``){``$sender_io``->to(``$room``)->emit(``'update_online_count'``,``"current{$online_count_now}人们在线,{$online_page_count_now}个页面打开"``);``$last_online_count``[``$room``]=``$online_count_now``;``$last_online_page_count``[``$room``]=``$online_page_count_now``;``}``}``});``});``if``(!defined(``'GLOBAL_START'``)){``Worker::runAll();``}`
