通过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(); 前公司吃饭是需要在钉钉报餐的,对于不挑剔的我每天都在公司吃饭,有时忘记报餐导致吃不了饭还是很麻烦的。看了下报餐系统需要的是json数据包含我的工号即可。于是编写如下代码,放在360网址监控,1小时执行1次<?php /*自动报餐类*/ class AutoBaocan{...
前面的文章对于高并发下单商品导致商品库存为负值的问题请先阅读再阅读本篇文章一定对您有帮助,建议亲手测试较好。加上文件锁后的下单处理代码:【一】.阻塞模式:(如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行)<?php //连接数据库 $con=mysqli_connect(...
//$ak开发密钥,$cityname城市名称(支持省县乡详细地址) public function getposition($ak,$cityname){ $callback=array('lng'=>0,'l...
【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...