资讯专栏INFORMATION COLUMN

基于workerman实现的web消息推送站内信功能

YFan / 1166人阅读

摘要:客户端访问后端,确认是否有发送给自己的站内信,如有,播放消息提示音,并更改页面站内信未读数。登陆请求成功,服务器监听程序会以作为用户的连接标识。调用上述的服务将信息推送到服务器监听程序。

流程说明

使用 web-msg-sender 作为 服务器监听程序

客户端(浏览器)通过websocket连接 服务器监听程序

服务器应用程序(后端) 通过curl访问 服务器监听程序,将需要推送的信息发送给 服务器监听程序

服务器监听程序 接收到后端发送的信息,广播发送给所有客户端,提示有新信息。

客户端 ajax访问 后端,确认是否有发送给自己的站内信,如有,播放消息提示音,并更改页面站内信未读数。


文档目录
[TOC]


服务器监听 配置 服务器监听程序

该程序对于php环境的要求是:

php cli >= 5.4,可以运行命令 php -v查看版本

linux系统要求php安装了posix和pcntl扩展。

可以使用 curl -Ss http://www.workerman.net/chec... | php 来检测当前环境是否符合要求。如果不符合,需要根据提示安装必要的扩展。

环境检测满足后,以ubuntu配置为例来进行配置:

安装相关扩展

$ sudo apt-get install php5-cli git gcc php-pear php5-dev libevent-dev -y

安装event扩展,==注意提示:Include libevent OpenSSL support [yes] : 时输入no回车,其它直接敲回车就行==

$ pecl install event

当出现Include libevent OpenSSL support [yes] :时,输入no

切换到root用户,添加event.so到php-cli的php-ini文件中。

$ sudo su

$ echo extension=event.so > /etc/php5/cli/conf.d/event.ini

切换回普通用户,切换到要保存项目的目录,clone web-msg-sender项目

$ su nancy

$ cd /var/www

$ git clone https://github.com/walkor/web...

使用composer安装,如果没有安装composer,请先安装。

// 下载composer

$ curl -sS https://getcomposer.org/insta... | php

// 设置全局

$ sudo mv composer.phar /usr/local/bin/composer

// 查看是否安装成功,如果有版本信息显示,则说明安装成功

$ composer -v

// 更新一下

$ composer self-update

// 进入到 web-msg-sender 项目中,使用composer进行安装

$ cd /var/www/web-msg-sender/

==$ composer install==

开启服务器监听程序

进入该项目文件,启动服务(以守护进程方式)

$ php start.php start -d

停止服务

$ php start.php stop

服务状态

$ php start.php status

客户端连接

客户端(即我们的前端代码)使用 socket.io 插件通过websocket连接 服务器监听程序

流程如下:

客户端使用socket建立连接,连接成功后,以用户实际的user_id发送登陆请求。

登陆请求成功,服务器监听程序会以user_id作为用户的连接标识。

当接收到服务器监听程序推送的信息,客户端发送请求到后端程序,查询是否有未读的站内信。

如果有,客户端播放消息声音,并且更新页面的站内信未读数。

相关代码如下:

// 引入前端文件


后端业务处理

后端使用了Laravel第三方插件Notifynder 管理通知。它提供了一个完整的API来处理通知,例如存储,检索和组织代码库以处理数百个通知。

配置 Notifynder 插件

后端程序composer.json 文件的 require 中增加

"fenos/notifynder": "^4.0"

进入后端程序项目,输入$ composer require fenos/notifynder 集成该插件。

config/app.php 文件的 providers 数组中增加

FenosNotifynderNotifynderServiceProvider::class,

在 aliases 数组中增加

"Notifynder" => FenosNotifynderFacadesNotifynder::class,

使用一下命令发布迁移以及配置notifynder

$ php artisan vendor:publish --provider="FenosNotifynderNotifynderServiceProvider"

$ php artisan migrate

在 User Model中使用FenosNotifynderNotifable,以ERP为例,我们的User Model是 app/Erp_company_user.php,在该文件增加引用。

use FenosNotifynderNotifable;

class Erp_company_user extends Model implements AuthenticatableContract, CanResetPasswordContract {
    
    use Notifable;
    
}

这时,我们只要使用 Erp_company_user model实例,就可以调用 FenosNotifynderNotifable 中的方法。例如:

$user = Erp_company_user::first();
$notifications = $user->notifications;

配置 config/notifynder 文件。

在 model 中配置 user model

"model" => "AppErp_company_user",

其他的根据实际应用时更改配置。

后端业务代码

提供推送数据到 服务器监听程序 的service。

将要推送的信息和推送的人等相关数据组装好,使用curl远程访问 服务器监听程序,监听程序进行推送。

namespace AppServiceSetting;

use AppServiceCommonService;

class MessageService extends CommonService{
    // 指明给谁推送,为空表示向所有在线用户推送
    private $to_uid;
    // 推送的url地址,上线时改成自己的服务器地址
    private $push_api_url = "http://your.workerman.com:2121/";

    protected function set_url($push_api_url){
        $this->push_api_url=$push_api_url;
    }
    /**
    * 站内信推送
    * @param int to_uid
    * @return array  
    */
    public function sent_message($to_uid=""){
        $this->to_uid=$to_uid;
        $post_data = array(
        "type" => "publish",
        "content" => "You have a new message",
        "to" => $this->to_uid,
        );
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_URL, $this->push_api_url );
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
        $return = curl_exec ( $ch );
        curl_close ( $ch );
        return $return;
    }
}

发送站内信

客户端后端程序请求发送站内信。

后端程序 将站内信信息保存到 Notification_category 数据表中,将要指定要推送的人信息保存到 notifications 表中。

调用 上述的 MessageService 服务将信息推送到 服务器监听程序

相关代码如下:

// 保存站内信信息
$Notification_categorie = new Notification_category;
$Notification_categorie->name = $name;
$Notification_categorie->text = $text;
$Notification_categorie->save();

//站内信id
$this->categorie_id=$Notification_categorie->id;
$this->categorie_num=0;
                
try {
    //推送的人,这里以发送全体为例
    $users = Erp_company_user::all();
   
   //循环保存要通知的人站内信信息
    Notifynder::loop($users, function(NotifynderBuilder $builder, $user, $key) {
      $this->categorie_num=$key+1;
      $builder->category($this->categorie_id)
        ->from($this->user["id"])
        ->to($user->id);
    })->send();
} catch (EntityNotIterableException $e) {
} catch (IterableIsEmptyException $e) {
}
//推送到服务器端监听程序
$sent_message = $this->MessageService->sent_message();

接收站内信

查询5分钟内的站内信,是否有发送给自己的未读信息,有的话,返回未读信息数。

相关代码如下:

//未读站内信的数量
$not_read_num=$this->user->countNotificationsNotRead();
//是否提示新信息,看最新的站内信的时间是否在5分钟内
$message=$this->user->getLastNotification();
if(empty($message))
    return array("num"=>0,"hit"=>0);
$message_time=$message->updated_at;
$five_minute_ago= Carbon::parse("-5 minute");
($message_time->gt($five_minute_ago) &&  $message->read==0 )? $hit=1 : $hit=0;
$result_array=array("num"=>$not_read_num,"hit"=>$hit);
return $result_array;  

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25769.html

相关文章

  • 单系统内信数据库设计思路

    摘要:第一版设计需求单用户之间通信融合了用户反馈需求数据库设计内容和收发者存在一张表中表这里一条存两次,类似邮件服务。参考群发站内信的实现群发站内信的实现续两年后,再议站内信的实现百万级用户量的站内信群发数据库设计 第一版设计 需求 :单用户之间通信(融合了用户反馈需求) 数据库设计:Message内容和收发者存在一张表中 message表: 这里一条Message存两次,类似邮件服务。...

    G9YH 评论0 收藏0
  • 单系统内信数据库设计思路

    摘要:第一版设计需求单用户之间通信融合了用户反馈需求数据库设计内容和收发者存在一张表中表这里一条存两次,类似邮件服务。参考群发站内信的实现群发站内信的实现续两年后,再议站内信的实现百万级用户量的站内信群发数据库设计 第一版设计 需求 :单用户之间通信(融合了用户反馈需求) 数据库设计:Message内容和收发者存在一张表中 message表: 这里一条Message存两次,类似邮件服务。...

    Achilles 评论0 收藏0
  • 单系统内信设计概述

    摘要:也可以在凌晨系统不是那么繁忙的时候操作。总结一下少量用户设计简单,但浪费空间,冗余高中量用户设计较简单,对表的操作压力大大量用户这不是增加几个表能解决的问题 基本功能 点到点的消息传送: 用户给用户 管理员给用户 点到面的消息传送 管理员给用户群 少量用户(10-999) 对于用户非常少的情况,没有必要深入的考虑数据库的优化,采用简单的表设计: 如表message ...

    Rainie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<