的流程描述使用web-msg-sender作为服务端监听。客户端(浏览器)通过websocket连接到服务器监听器。服务端应用(后端)通过curl访问服务端监听器,将需要推送的信息发送给服务端监听器。服务端监听器接收到后端发送的信息,广播给所有客户端,提示有新信息。客户端ajax访问后台,确认是否有站内消息发给自己。如果是,则播放消息提示音并修改页面未读消息条数。文档目录[TOC]服务器监控配置服务器监控程序程序对php环境的要求是:phpcli>=5.4,可以运行命令php-v查看版本linux系统要求php安装时带posix和pcntl扩展名。您可以使用curl-Sshttp://www.workerman.net/chec...|php查看当前环境是否符合要求。如果没有,则需要根据提示安装必要的扩展。环境检测满足后,以ubuntu配置为例进行配置:安装相关扩展$sudoapt-getinstallphp5-cligitgccphp-pearphp5-devlibevent-dev-yinstalleventextension,==注意:IncludelibeventOpenSSLsupport[yes]:inputno回车,否则直接回车==$peclinstallevent当IncludelibeventOpenSSLsupport[yes]:出现时,输入no切换到root用户,将event.so添加到php-在cli的php-ini文件中。$sudosu$echoextension=event.so>/etc/php5/cli/conf.d/event.ini切换回普通用户,切换到你要保存项目的目录,克隆web-msg-sender项目$sunancy$cd/var/www$gitclonehttps://github.com/walkor/web...使用composer安装,如果没有安装composer请先安装。//下载composer$curl-sShttps://getcomposer.org/insta...|php//设置全局$sudomvcomposer.phar/usr/local/bin/composer//检查是否安装成功,如果有版本信息,则安装成功$composer-v//更新$composerself-update//进入web-msg-sender项目,使用composer安装$cd/var/www/web-msg-sender/==$composerinstall==启用服务器监控程序进入项目文件,启动服务(以守护进程的方式)$phpstart.phpstart-dstopservice$phpstart.phpstopservicestatus$phpstart.phpstatusclientconnection客户端(即我们的前端代码)连接到服务器侦听器使用socket.io插件通过websocket。过程如下:客户端使用socket建立连接。连接成功后,它会发送一个带有用户实际user_id的登录请求。如果登录请求成功,服务器监听器将使用user_id作为用户的连接标识符。客户端收到服务端监听推送的信息后,向后台程序发送请求,查询站内是否有未读消息。如果有,则客户端播放消息声音,并在不阅读的情况下更新页面上的站内消息。相关代码如下://导入前端文件后端业务处理后端使用Laravel第三方插件NotifynderManageNotifications它提供了一个完整的API来处理通知,例如存储、检索和组织代码库来处理数百个通知。配置Notifynder插件在后端程序的composer.json文件的require中加入"fenos/notifynder":"^4.0"进入后端程序工程,输入$composerrequirefenos/notifynder进行集成插件。在config/app.php文件的providers数组中添加Fenos\Notifynder\NotifynderServiceProvider::class,在aliases数组中添加'Notifynder'=>Fenos\Notifynder\Facades\Notifynder::class,使用如下命令发布迁移并配置notifynder$phpartisanvendor:publish--provider="FenosNotifynderNotifynderServiceProvider"$phpartisanmigrate在UserModel中使用FenosNotifynderNotifable,以ERP为例,我们的UserModel是app/Erp_company_user.php,添加对这个文件的引用。使用Fenos\Notifynder\Notifable;classErp_company_userextendsModelimplementsAuthenticatableContract,CanResetPasswordContract{使用Notifable;这时候我们只要使用erp_company_user模型实例就可以调用FenosNotifynderNotifable中的方法了。例如:$user=Erp_company_user::first();$notifications=$user->notifications;配置config/notifynder文件。在模型中配置用户模型'model'=>'App\Erp_company_user',其他的配置根据实际应用更改。后端业务代码提供向服务端监听器推送数据的服务。组装好要推送的信息和推送的人等相关数据,使用curl远程访问服务器监听器,监听器就会推送。namespaceApp\Service\Setting;useApp\Service\CommonService;classMessageServiceextendsCommonService{//表示推送给谁,为空表示推送private$to_uid给所有在线用户;//推送的url地址,上线时改成自己private$push_api_url='http://your.workerman.com:2121/';保护函数set_url($push_api_url){$this->push_api_url=$push_api_url;}/***站内消息推送*@paramintto_uid*@returnarray*/publicfunctionsent_message($to_uid=''){$this->to_uid=$to_uid;$post_data=array('type'=>'publish','content'=>'你有一条新消息','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);返回$返回;}}发送内部消息客户端向后端程序请求发送内部消息。人员信息保存到通知表中。调用上面的MessageService服务,将消息推送给服务端监听。相关代码如下://保存站内信息$Notification_categorie=newNotification_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->类别($this->categorie_id)->from($this->user['id'])->to($user->id);})->send();}catch(EntityNotIterableException$e){}catch(IterableIsEmptyException$e){}//push到服务端监听程序$sent_message=$this->MessageService->sent_message();接收站内消息,查询5分钟内的站内消息,是否有发送给你的未读消息,有则返回未读消息数。相关代码如下://本站未读消息数$not_read_num=$this->user->countNotificationsNotRead();//是否提示新信息,查看本站最新消息是否在5分钟内$message=$this->user->getLastNotification();if(empty($message))returnarray('num'=>0,'hit'=>0);$message_time=$message->updated_at;$five_minute_ago=Carbon::parse('-5minute');($message_time->gt($five_minute_ago)&&$message->read==0)?$hit=1:$hit=0;$result_array=array('num'=>$not_read_num,'hit'=>$hit);返回$result_array;
