摘要:客戶端訪問后端,確認是否有發送給自己的站內信,如有,播放消息提示音,并更改頁面站內信未讀數。登陸請求成功,服務器監聽程序會以作為用戶的連接標識。調用上述的服務將信息推送到服務器監聽程序。
流程說明
使用 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;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25769.html
摘要:第一版設計需求單用戶之間通信融合了用戶反饋需求數據庫設計內容和收發者存在一張表中表這里一條存兩次,類似郵件服務。參考群發站內信的實現群發站內信的實現續兩年后,再議站內信的實現百萬級用戶量的站內信群發數據庫設計 第一版設計 需求 :單用戶之間通信(融合了用戶反饋需求) 數據庫設計:Message內容和收發者存在一張表中 message表: 這里一條Message存兩次,類似郵件服務。...
摘要:第一版設計需求單用戶之間通信融合了用戶反饋需求數據庫設計內容和收發者存在一張表中表這里一條存兩次,類似郵件服務。參考群發站內信的實現群發站內信的實現續兩年后,再議站內信的實現百萬級用戶量的站內信群發數據庫設計 第一版設計 需求 :單用戶之間通信(融合了用戶反饋需求) 數據庫設計:Message內容和收發者存在一張表中 message表: 這里一條Message存兩次,類似郵件服務。...
摘要:也可以在凌晨系統不是那么繁忙的時候操作。總結一下少量用戶設計簡單,但浪費空間,冗余高中量用戶設計較簡單,對表的操作壓力大大量用戶這不是增加幾個表能解決的問題 基本功能 點到點的消息傳送: 用戶給用戶 管理員給用戶 點到面的消息傳送 管理員給用戶群 少量用戶(10-999) 對于用戶非常少的情況,沒有必要深入的考慮數據庫的優化,采用簡單的表設計: 如表message ...
閱讀 2315·2021-09-28 09:45
閱讀 3599·2021-09-24 09:48
閱讀 2266·2021-09-22 15:49
閱讀 3099·2021-09-08 16:10
閱讀 1592·2019-08-30 15:54
閱讀 2327·2019-08-30 15:53
閱讀 3021·2019-08-29 18:42
閱讀 2873·2019-08-29 16:19