国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于workerman實(shí)現(xiàn)的web消息推送站內(nèi)信功能

YFan / 1193人閱讀

摘要:客戶端訪問后端,確認(rèn)是否有發(fā)送給自己的站內(nèi)信,如有,播放消息提示音,并更改頁面站內(nèi)信未讀數(shù)。登陸請(qǐng)求成功,服務(wù)器監(jiān)聽程序會(huì)以作為用戶的連接標(biāo)識(shí)。調(diào)用上述的服務(wù)將信息推送到服務(wù)器監(jiān)聽程序。

流程說明

使用 web-msg-sender 作為 服務(wù)器監(jiān)聽程序

客戶端(瀏覽器)通過websocket連接 服務(wù)器監(jiān)聽程序

服務(wù)器應(yīng)用程序(后端) 通過curl訪問 服務(wù)器監(jiān)聽程序,將需要推送的信息發(fā)送給 服務(wù)器監(jiān)聽程序

服務(wù)器監(jiān)聽程序 接收到后端發(fā)送的信息,廣播發(fā)送給所有客戶端,提示有新信息。

客戶端 ajax訪問 后端,確認(rèn)是否有發(fā)送給自己的站內(nèi)信,如有,播放消息提示音,并更改頁面站內(nèi)信未讀數(shù)。


文檔目錄
[TOC]


服務(wù)器監(jiān)聽 配置 服務(wù)器監(jiān)聽程序

該程序?qū)τ趐hp環(huán)境的要求是:

php cli >= 5.4,可以運(yùn)行命令 php -v查看版本

linux系統(tǒng)要求php安裝了posix和pcntl擴(kuò)展。

可以使用 curl -Ss http://www.workerman.net/chec... | php 來檢測(cè)當(dāng)前環(huán)境是否符合要求。如果不符合,需要根據(jù)提示安裝必要的擴(kuò)展。

環(huán)境檢測(cè)滿足后,以u(píng)buntu配置為例來進(jìn)行配置:

安裝相關(guān)擴(kuò)展

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

安裝event擴(kuò)展,==注意提示:Include libevent OpenSSL support [yes] : 時(shí)輸入no回車,其它直接敲回車就行==

$ pecl install event

當(dāng)出現(xiàn)Include libevent OpenSSL support [yes] :時(shí),輸入no

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

$ sudo su

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

切換回普通用戶,切換到要保存項(xiàng)目的目錄,clone web-msg-sender項(xiàng)目

$ su nancy

$ cd /var/www

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

使用composer安裝,如果沒有安裝composer,請(qǐng)先安裝。

// 下載composer

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

// 設(shè)置全局

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

// 查看是否安裝成功,如果有版本信息顯示,則說明安裝成功

$ composer -v

// 更新一下

$ composer self-update

// 進(jìn)入到 web-msg-sender 項(xiàng)目中,使用composer進(jìn)行安裝

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

==$ composer install==

開啟服務(wù)器監(jiān)聽程序

進(jìn)入該項(xiàng)目文件,啟動(dòng)服務(wù)(以守護(hù)進(jìn)程方式)

$ php start.php start -d

停止服務(wù)

$ php start.php stop

服務(wù)狀態(tài)

$ php start.php status

客戶端連接

客戶端(即我們的前端代碼)使用 socket.io 插件通過websocket連接 服務(wù)器監(jiān)聽程序

流程如下:

客戶端使用socket建立連接,連接成功后,以用戶實(shí)際的user_id發(fā)送登陸請(qǐng)求。

登陸請(qǐng)求成功,服務(wù)器監(jiān)聽程序會(huì)以u(píng)ser_id作為用戶的連接標(biāo)識(shí)。

當(dāng)接收到服務(wù)器監(jiān)聽程序推送的信息,客戶端發(fā)送請(qǐng)求到后端程序,查詢是否有未讀的站內(nèi)信。

如果有,客戶端播放消息聲音,并且更新頁面的站內(nèi)信未讀數(shù)。

相關(guān)代碼如下:

// 引入前端文件


后端業(yè)務(wù)處理

后端使用了Laravel第三方插件Notifynder 管理通知。它提供了一個(gè)完整的API來處理通知,例如存儲(chǔ),檢索和組織代碼庫以處理數(shù)百個(gè)通知。

配置 Notifynder 插件

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

"fenos/notifynder": "^4.0"

進(jìn)入后端程序項(xiàng)目,輸入$ composer require fenos/notifynder 集成該插件。

config/app.php 文件的 providers 數(shù)組中增加

FenosNotifynderNotifynderServiceProvider::class,

在 aliases 數(shù)組中增加

"Notifynder" => FenosNotifynderFacadesNotifynder::class,

使用一下命令發(fā)布遷移以及配置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;
    
}

這時(shí),我們只要使用 Erp_company_user model實(shí)例,就可以調(diào)用 FenosNotifynderNotifable 中的方法。例如:

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

配置 config/notifynder 文件。

在 model 中配置 user model

"model" => "AppErp_company_user",

其他的根據(jù)實(shí)際應(yīng)用時(shí)更改配置。

后端業(yè)務(wù)代碼

提供推送數(shù)據(jù)到 服務(wù)器監(jiān)聽程序 的service。

將要推送的信息和推送的人等相關(guān)數(shù)據(jù)組裝好,使用curl遠(yuǎn)程訪問 服務(wù)器監(jiān)聽程序,監(jiān)聽程序進(jìn)行推送。

namespace AppServiceSetting;

use AppServiceCommonService;

class MessageService extends CommonService{
    // 指明給誰推送,為空表示向所有在線用戶推送
    private $to_uid;
    // 推送的url地址,上線時(shí)改成自己的服務(wù)器地址
    private $push_api_url = "http://your.workerman.com:2121/";

    protected function set_url($push_api_url){
        $this->push_api_url=$push_api_url;
    }
    /**
    * 站內(nèi)信推送
    * @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;
    }
}

發(fā)送站內(nèi)信

客戶端后端程序請(qǐng)求發(fā)送站內(nèi)信。

后端程序 將站內(nèi)信信息保存到 Notification_category 數(shù)據(jù)表中,將要指定要推送的人信息保存到 notifications 表中。

調(diào)用 上述的 MessageService 服務(wù)將信息推送到 服務(wù)器監(jiān)聽程序

相關(guān)代碼如下:

// 保存站內(nèi)信信息
$Notification_categorie = new Notification_category;
$Notification_categorie->name = $name;
$Notification_categorie->text = $text;
$Notification_categorie->save();

//站內(nèi)信id
$this->categorie_id=$Notification_categorie->id;
$this->categorie_num=0;
                
try {
    //推送的人,這里以發(fā)送全體為例
    $users = Erp_company_user::all();
   
   //循環(huán)保存要通知的人站內(nèi)信信息
    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) {
}
//推送到服務(wù)器端監(jiān)聽程序
$sent_message = $this->MessageService->sent_message();

接收站內(nèi)信

查詢5分鐘內(nèi)的站內(nèi)信,是否有發(fā)送給自己的未讀信息,有的話,返回未讀信息數(shù)。

相關(guān)代碼如下:

//未讀站內(nèi)信的數(shù)量
$not_read_num=$this->user->countNotificationsNotRead();
//是否提示新信息,看最新的站內(nèi)信的時(shí)間是否在5分鐘內(nèi)
$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;  

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25769.html

相關(guān)文章

  • 單系統(tǒng)內(nèi)信數(shù)據(jù)庫設(shè)計(jì)思路

    摘要:第一版設(shè)計(jì)需求單用戶之間通信融合了用戶反饋需求數(shù)據(jù)庫設(shè)計(jì)內(nèi)容和收發(fā)者存在一張表中表這里一條存兩次,類似郵件服務(wù)。參考群發(fā)站內(nèi)信的實(shí)現(xiàn)群發(fā)站內(nèi)信的實(shí)現(xiàn)續(xù)兩年后,再議站內(nèi)信的實(shí)現(xiàn)百萬級(jí)用戶量的站內(nèi)信群發(fā)數(shù)據(jù)庫設(shè)計(jì) 第一版設(shè)計(jì) 需求 :單用戶之間通信(融合了用戶反饋需求) 數(shù)據(jù)庫設(shè)計(jì):Message內(nèi)容和收發(fā)者存在一張表中 message表: 這里一條Message存兩次,類似郵件服務(wù)。...

    G9YH 評(píng)論0 收藏0
  • 單系統(tǒng)內(nèi)信數(shù)據(jù)庫設(shè)計(jì)思路

    摘要:第一版設(shè)計(jì)需求單用戶之間通信融合了用戶反饋需求數(shù)據(jù)庫設(shè)計(jì)內(nèi)容和收發(fā)者存在一張表中表這里一條存兩次,類似郵件服務(wù)。參考群發(fā)站內(nèi)信的實(shí)現(xiàn)群發(fā)站內(nèi)信的實(shí)現(xiàn)續(xù)兩年后,再議站內(nèi)信的實(shí)現(xiàn)百萬級(jí)用戶量的站內(nèi)信群發(fā)數(shù)據(jù)庫設(shè)計(jì) 第一版設(shè)計(jì) 需求 :單用戶之間通信(融合了用戶反饋需求) 數(shù)據(jù)庫設(shè)計(jì):Message內(nèi)容和收發(fā)者存在一張表中 message表: 這里一條Message存兩次,類似郵件服務(wù)。...

    Achilles 評(píng)論0 收藏0
  • 單系統(tǒng)內(nèi)信設(shè)計(jì)概述

    摘要:也可以在凌晨系統(tǒng)不是那么繁忙的時(shí)候操作。總結(jié)一下少量用戶設(shè)計(jì)簡單,但浪費(fèi)空間,冗余高中量用戶設(shè)計(jì)較簡單,對(duì)表的操作壓力大大量用戶這不是增加幾個(gè)表能解決的問題 基本功能 點(diǎn)到點(diǎn)的消息傳送: 用戶給用戶 管理員給用戶 點(diǎn)到面的消息傳送 管理員給用戶群 少量用戶(10-999) 對(duì)于用戶非常少的情況,沒有必要深入的考慮數(shù)據(jù)庫的優(yōu)化,采用簡單的表設(shè)計(jì): 如表message ...

    Rainie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<