当前位置:首页 > PHP > 正文内容

php使用swoole扩展推送消息

高老师7年前 (2017-12-29)PHP2803

通过http推送消息给socket,socket服务再向客户端推送

<?php
/*
 * Socket推送
 * 请用守护进程方式启动php msgservice.php &   (socket只支持linux)
 * 默认使用SWOOLE_PROCESS模式,echo终端是禁止的,如果要观察日志,保存到log中.
 * status=1,小程序推送
 * status=2,点餐机->socket->身份识别    
 * status=3,socket->点餐机->推送订单
 * status=4,点餐机->socket->告知消息已经处理
 */
class WebsocketServer {
    public $server;
	
	//主机群
	private $client=array();	
	//消息群
	private $clientmsg=array();
	
    public function __construct() {
    	//01.绑定网卡
        $this->server = new swoole_websocket_server("0.0.0.0", 9502);
		
		//02.主动握手
        $this->server->on('open', function (swoole_websocket_server $server, $request) {
                //echo "server: handshake success with fd{$request->fd}\n";
            });
		//03.消息获取
        $this->server->on('message', function (swoole_websocket_server $server, $frame) {
        	
                //echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
				
				//3.1.记录客户端信息
				$data=json_decode($frame->data,true);

				if(isset($data['status']) && $data['status']==2){
					$rev=array(
						'hostfd'=>$frame->fd,//'在swoole中是顺序'
						'shopid'=>$data['shopid'],
					);
					
					//新来的客户端,看看是否有你的订单
					foreach ($this->clientmsg as  $value) {
						if($value['shopid']==$rev['shopid']){
							//echo 'have';
							$data=json_encode($value);
							$server->push($frame->fd,$data);
							break;
						}
					}
					//多个终端只识别第一个
					$isnew=1;
					foreach ($this->client as  $value) {
						if($value['shopid']==$rev['shopid']){
							$isnew=0;
							break;
						}
					}
					if($isnew){
						array_push($this->client,$rev);						
					}
					else
					{
						//echo 'This client duplication,now client num:'.count($this->client).'\n';
					}
					
				}
				
				//3.2.点餐机已经处理的消息直接清理
				if( isset($data['status']) && $data['status']==3){
					$orderid=$data['orderid'];
					foreach ($this->clientmsg as $key => $value) {
							if($value['orderid']==$orderid){
								unset($this->clientmsg[$key]);
								array_merge($this->clientmsg);
								//echo 'order  is  reved!';
								break;
							}
					}
				}				
            });
		//04.断开事件,清理无效主机
        $this->server->on('close', function ($ser, $fd) {
				foreach ($this->client as $key => $value) {
						if($value['hostfd']==$fd){
							unset($this->client[$key]);
							array_merge($this->client);
						}
				}
				//echo "client {$fd} closed,now client num:".count($this->client).'\n';
            });
		//05.小程序推送,实例不走nginx/apache,请访问本进程端口	
        $this->server->on('request', function ($request, $response) {

        		//带有推送表示的主体
        		if(isset($request->post['status']) && $request->post['status']==1)
        		{
        			//接收小程序推送	
        			$rev=array(
        				'type'=> $request->post['type'],
        				'shopid' =>$request->post['shopid'],
 						'orderid'=>$request->post['orderid'],
					);
					
					$response->end('ok');

					//直接尝试发送给点餐机
					foreach ($this->client as $value) {
						if($value['shopid']==$rev['shopid']){
							$data=json_encode($rev);
							$this->server->push($value['hostfd'],$data);
							break;
						}
					}
					//入列
					array_push($this->clientmsg,$rev);
					
        		}

        });
			
        $this->server->start();
    }
	
}
new WebsocketServer();

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/53.html

分享给朋友:

“php使用swoole扩展推送消息” 的相关文章

 php调用.net的dll文件,php调用.net dll

php调用.net的dll文件,php调用.net dll

本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...

 php xml字符串转数组,phpxml转数组,php 将xml转换成数组

php xml字符串转数组,phpxml转数组,php 将xml转换成数组

001源码:/*  * $xml_str是xml字符串  */ function  xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...

php多进程,php多进程处理任务,php多进程应用场景

php多进程,php多进程处理任务,php多进程应用场景

php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不...

 php max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

php数组合并 array_merge和+号的区别

php数组合并 array_merge和+号的区别

array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...