init: 项目初始代码
This commit is contained in:
148
extend/utils/OrederStatusSync4Redis.php
Normal file
148
extend/utils/OrederStatusSync4Redis.php
Normal file
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
namespace utils;
|
||||
use think\cache\driver\Redis;
|
||||
use think\facade\Config;
|
||||
|
||||
class OrederStatusSync4Redis
|
||||
{
|
||||
private $client;
|
||||
private $key;
|
||||
private $group;
|
||||
private $consumer;
|
||||
|
||||
public function __construct($config=[])
|
||||
{
|
||||
$this->key = Config::get('redis.erp.order_sync_stream.key');
|
||||
if (empty($this->key)) {
|
||||
throw new \Exception('未配置默认STREAM标识key');
|
||||
}
|
||||
$this->group = Config::get('redis.erp.order_sync_stream.group');
|
||||
if (empty($this->group)) {
|
||||
throw new \Exception('未配置默认STREAM消费者组');
|
||||
}
|
||||
$this->consumer = Config::get('redis.erp.order_sync_stream.consumer');
|
||||
if (empty($this->consumer)) {
|
||||
throw new \Exception('未配置默认STREAM消费者');
|
||||
}
|
||||
if (empty($config)) {
|
||||
$config = Config::get('redis.erp.conf');
|
||||
}
|
||||
$this->client = new Redis($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $key 设置stream标识key
|
||||
*/
|
||||
public function streamKey($key)
|
||||
{
|
||||
if (empty($key)) {
|
||||
return false;
|
||||
}
|
||||
$this->key = $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $group 设置消费者组
|
||||
*/
|
||||
public function streamGroup($group)
|
||||
{
|
||||
if (empty($group)) {
|
||||
return false;
|
||||
}
|
||||
$this->group = $group;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $consumer 设置消费者
|
||||
*/
|
||||
public function streamConsumer($consumer)
|
||||
{
|
||||
if (empty($consumer)) {
|
||||
return false;
|
||||
}
|
||||
$this->consumer = $consumer;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否存在消息组
|
||||
* @param string $streamGroup 消费者组
|
||||
* @return bool
|
||||
*/
|
||||
public function hasGroup($streamGroup='')
|
||||
{
|
||||
$groups = $this->client->xInfo('GROUPS', $this->key);
|
||||
if (empty($groups)) {
|
||||
return false;
|
||||
}
|
||||
if (empty($streamGroup)) {
|
||||
$streamGroup = $this->group; // 使用配置的消费组
|
||||
}
|
||||
if (!in_array($streamGroup, array_column($groups, 'name'))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建消息组
|
||||
* @param string $streamGroup 消费者组
|
||||
* @param string $msgID 0为查看所有消息,$为查看最新消息
|
||||
*/
|
||||
public function createGroup($streamGroup='', $msgID='0')
|
||||
{
|
||||
if (empty($streamGroup)) {
|
||||
$streamGroup = $this->group; // 使用配置的消费组
|
||||
}
|
||||
$this->client->xGroup('CREATE', $this->key, $streamGroup, $msgID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取新消息
|
||||
* @param int $count 获取条数
|
||||
* @param int $block 是否阻塞:0为永久阻塞,null为不阻塞,1000为阻塞1秒
|
||||
* @return array
|
||||
*/
|
||||
public function fetchMessage($count=null, $block=null)
|
||||
{
|
||||
$keys[$this->key] = '>'; // 获取新消息
|
||||
$messages = $this->client->xReadGroup($this->group, $this->consumer, $keys, $count, $block);
|
||||
return !empty($messages) ? $messages[$this->key] : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未处理消费
|
||||
* @param int $count 获取条数
|
||||
* @param int $block 是否阻塞:0为永久阻塞,null为不阻塞,1000为阻塞1秒
|
||||
* @return array
|
||||
*/
|
||||
public function fetchMessage4UnAck($count=null, $block=null)
|
||||
{
|
||||
$keys[$this->key] = '0'; // 获取未处理的
|
||||
$messages = $this->client->xReadGroup($this->group, $this->consumer, $keys, $count, $block);
|
||||
return !empty($messages) ? $messages[$this->key] : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取处理PENDING中消息
|
||||
* @param int $count 获取条数
|
||||
* @return array
|
||||
*/
|
||||
public function fetchMessage4Pending($count = 10)
|
||||
{
|
||||
$messages = $this->client->xPending($this->key, $this->group, '-', '+', $count, $this->consumer);
|
||||
return !empty($messages) ? $messages : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据消息ID设为消息已处理
|
||||
* @param array|string 消息ID
|
||||
* @param int 处理系数
|
||||
*/
|
||||
public function ack($messagesID)
|
||||
{
|
||||
if (!is_array($messagesID)) {
|
||||
$messagesID = [$messagesID];
|
||||
}
|
||||
return $this->client->xAck($this->key, $this->group, $messagesID);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user