imsocket.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace app\api\imsocket;
  3. use think\worker\Server;
  4. class imsocket extends Server
  5. {
  6. protected $socket = 'websocket://0.0.0.0:2345';
  7. protected $uidConnnections = array();
  8. public function __construct()
  9. {
  10. parent::__construct();
  11. }
  12. public function onConnect($connection){
  13. $msg=['type'=>'conn','msg'=>'连接服务器成功'];
  14. $connection->send(json_encode($msg));
  15. }
  16. public function onMessage($connection,$data)
  17. {
  18. $arr = json_decode($data);
  19. $db = new \mysqli('47.112.222.163','nn2022060401','RL2rpdKdKicikFBx','nn2022060401','3306');
  20. $db->set_charset('utf8');
  21. //绑定用户
  22. if($arr->type == "bind" && !isset($connection->uid)){
  23. $connection->uid = $arr->uid;
  24. //保存uid到connection的映射,实现针对特定uid的推送
  25. $this->worker->uidConnections[$connection->uid]=$connection;
  26. if($arr->school_id){
  27. //如果是学校的话,返回一个老师的id给他。
  28. $tsql="SELECT u.user_id,u.user_type,u.real_name FROM yoshop_user_info i JOIN yoshop_user u ON i.user_id = u.user_id WHERE u.user_type=3 AND u.is_delete=0 AND i.school_id=".$arr->school_id." AND i.status=1";
  29. $resT=$db->query($tsql);
  30. if($resT->num_rows > 0) {
  31. $tempList=[];
  32. while($row = $resT->fetch_assoc()) {
  33. $temp['uid']= $row['user_id'];
  34. $temp['uname']= $row['real_name'];
  35. $temp['utype']= $row['user_type'];
  36. if(isset($this->worker->uidConnections[$row['user_id']])){
  37. //是否在线,在线加权重
  38. $temp['w']=1;
  39. }else{
  40. $temp['w']=0;
  41. }
  42. $tempList[]=$temp;
  43. }
  44. //按权重随机返回
  45. $weight = 0;
  46. $tempdata = array ();
  47. foreach ($tempList as $one) {
  48. $weight += $one['w'];
  49. for ($i = 0; $i < $one['w']; $i++) {
  50. $tempdata[] = $one;
  51. }
  52. }
  53. $use = rand(0, $weight -1);
  54. $one = $tempdata[$use];
  55. $msg=['type'=>'bind','fansinfo'=>['uid'=>$one['uid'],'uname'=>$one['uname']]];
  56. }else{
  57. $msg=['type'=>'bind','fansinfo'=>''];
  58. }
  59. $connection->send(json_encode($msg));
  60. }
  61. }
  62. //聊天
  63. if($arr->type=="text"){
  64. if(isset($this->worker->uidConnections[$arr->to_user_id])){
  65. $conn= $this->worker->uidConnections[$arr->to_user_id];
  66. $is_push=0;
  67. $conn->send($data);
  68. }else{
  69. // //先返回给发送者错误信息
  70. // $conn2= $this->worker->uidConnections[$arr->from_user_id];
  71. // $msg=['type'=>'error','msg'=>'对方不在线'];
  72. // $conn2->send(json_encode($msg));
  73. $is_push=1;
  74. }
  75. $insetSql="INSERT INTO yoshop_imchat (from_user_id,to_user_id,message,school_id,speciality_id,sendtime,chat_key,is_push)
  76. VALUES ('".$arr->from_user_id."','".$arr->to_user_id."','".$arr->msg."','".$arr->school_id."','".$arr->speciality_id."','".$arr->sendtime."','".$arr->chat_key."','".$is_push."')";
  77. //保存数据
  78. $rs=$db->query($insetSql);
  79. }
  80. //获取聊天记录
  81. if($arr->type=="loadHistory"){
  82. $tfkey=$arr->tfkey;
  83. $lastMessageTimeStamp=$arr->lastMessageTimeStamp;
  84. $from_user_id=$arr->from_user_id;
  85. $conn2= $this->worker->uidConnections[$from_user_id];
  86. $mlistSql="select id,from_user_id,to_user_id,message,sendtime,is_push from yoshop_imchat where chat_key=$tfkey and sendtime < $lastMessageTimeStamp order by sendtime desc limit 10";
  87. $resML = $db->query($mlistSql);
  88. if($resML->num_rows > 0) {
  89. $msgList=[];
  90. //处理一下 未读变已读
  91. $push_id='';
  92. while($row = $resML->fetch_assoc()) {
  93. $temML['id']= $row['id'];
  94. $temML['from_user_id']= $row['from_user_id'];
  95. $temML['to_user_id']= $row['to_user_id'];
  96. $temML['message']= $row['message'];
  97. $temML['sendtime']= $row['sendtime'];
  98. if($row['is_push']==1){
  99. if(empty($push_id)){
  100. $push_id=$row['id'];
  101. }else{
  102. $push_id=$push_id .','.$row['id'];
  103. }
  104. }
  105. $msgList[]=$temML;
  106. }
  107. //更新未读变已读
  108. $upSql="UPDATE yoshop_imchat SET is_push=0 WHERE id IN(".$push_id.");";
  109. $db->query($upSql);
  110. $msg=['type'=>'loadHistory','mgList'=>$msgList];
  111. }else{
  112. $msg=['type'=>'loadHistory','mgList'=>''];
  113. }
  114. $conn2->send(json_encode($msg));
  115. }
  116. $db->close();
  117. }
  118. public function onClose($connection){
  119. unset($this->worker->uidConnections[$connection->uid]);
  120. }
  121. }