- 1.2 环境搭建&安装
- 1.3 项目说明
- 1.4 路由说明
- 1.5 目录结构
- 2.1 模板
- 2.1.1 前台模板
- 2.1.2 后台模板
- 2.1.3 模板标签
- 2.1.3.1 content内容标签
- 2.1.3.2 spf内容标签
- 2.1.3.3 tags内容标签
- 2.1.3.4 comment评论标签
- 2.1.3.5 position推荐位标签
- 2.1.3.6 get数据获取标签
- 2.1.3.7 template模板引入标签
- 2.1.3.8 navigate导航标签
- 2.1.3.9 pre上一篇标签
- 2.1.3.10 next下一篇标签
- 2.1.3.11 blockcache区块缓存标签
- 2.2 行为管理
- 2.2.1 行为规则
- 2.2.2 使用方法
- 2.2.3 测试Behaivor
- 2.3 模块开发
- 2.4.1 权限
- 2.4.2 框架页
- 2.4.3 消息中心
- 2.4.4 登录页安全
- 2.5 请求缓存
- 3.1 Auth
- 3.1.1 通用授权
- 3.1.2 自动登录授权
- 3.1.3 开放平台授权
- 3.2 Wechat
- 3.2.2 v2.x
- 3.3 Area
- 3.3.1 中国区域
- 3.3.2 中国高校
- 3.4 Sms
- 3.4.1 v3
- 3.4.2 v2
- 3.5 Cron
- 3.6 Transport
- 3.6.1 使用
- 3.6.2 最佳实践
- 3.7 Message
- 3.8 Record
- 3.8.1 数据结构
- 3.8.2 使用指南
- 3.9 Wxapp
- 3.10 Log
- 3.11 Alipay
- 3.12 Unionpay
- 3.13 Oss
- 3.14 Chart
- 3.15 Queue
- 3.16 Mirror
- 3.17 Wap
- 3.18 Shop
- 3.19 Search
- 3.20 Addons
- 3.21 Collection
- 3.22 Comment
- 3.23 Domain
- 3.24 Form
- 3.25 Link
- 3.26 Vote
- 3.27 Member
- 4.1 规范和约定
- 4.2 部署指南
- 4.3 常见错误
- 4.4 开发Tips汇总
- 4.4.1 模块
- 4.4.2 自定义后台iconfont
- 4.4.3 自定义成功(失败)页面
- 4.4.4 自定义栏目列表搜索条件
- 4.4.5 根据管理员的权限显示
- 4.5 数据库的存储引擎
- 4.6 行为管理最佳实践
- 4.7 性能优化
- 4.8 ThinkPHP
- 4.8.1 模型
- 4.9.1 发送邮件
- 5.1 系统函数
- 5.2 技术栈
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.7 Message
消息系统
描述:一个系统里面通常都会有一些类似于站内信,用户私信等消息(Message),然后通过邮件,微信模板消息,短信等多种渠道(Sender)发送到对应用户上。消息系统这是解决这个问题。
目录结构
.
├── Controller
├── CronScript 计划任务脚本
├── Install
├── Libs 核心实现库
├── Messages 消息实体类
├── Model
├── Senders 发送渠道实现
├── Service 服务
└── Uninstall
使用指南
1.创建你的消息实体类
在 Message/Messages/
目录下创建消息实体类,并继承 Message\Libs\Message
类,实现 createSender()
use Message\Libs\Message;
use Message\Model\MessageModel;
class SimpleMessage extends Message {
/**
* SimpleMessage constructor.
*
* @param string $sender 发送人
* @param string $receiver 接收人
* @param string $content 消息ID
*/
public function __construct($sender, $receiver, $content = '') {
$this->setContent($content);
$this->setType(MessageModel::TYPE_MESSAGE); //消息类型本系统没有过多的指定,默认提供 message 私信 和 remind 提醒这两种
$this->setSender($sender); //发送人,可以是ID,也可以名字,由你的业务决定
$this->setSenderType('member');//发送人的类型,可以为空,由你的业务决定
$this->setReceiver($receiver); //接收人,可以是ID,也可以名字,由你的业务决定
$this->setReceiverType('member'); //接收人的类型,可以为空,由你的业务决定
$this->setTarget('1'); //消息源,如某某人点赞了一文章,则 Target 可能是文章ID,具体由你的业务决定
$this->setTargetType('11');//消息源类型,如某某人点赞了一文章,则 Target 应该是文章类型名称,具体由你的业务决定
}
/**
* 定义该消息的消息分发渠道
*
* @return array Senders数组
*/
function createSender() {
return [
new SimpleSender(), //示例:发邮件
new SimpleWxSender() //示例:发微信模板消息
];
}
}
2.创建你的分发渠道
在 Message/Senders/
目录下创建消息实体类,并继承 Message\Libs\Sender
类,实现 doSend()
示例:SimpleSender:
class SimpleSender extends Sender {
/**
* 发送消息操作
*
* @param Message $message
* @return boolean
*/
function doSend(Message $message) {
echo 'simple send => ' . $message->getContent() . '<br>';
return true;
}
}
3.创建消息
使用 Message\Service\MessageService::createMessage($msg)
添加消息
use Message\Service\MessageService;
class TestController extends AdminBase {
//发送信息
function pushMessage() {
$sender = 'jayin';
$receiver = 'admin';
$content = '用户 ' . $sender . ' 对用户 ' . $receiver . ' 说:' . '你好,这是推送 at ' . date('Y-m-d H:i:s');
$msg = new SimpleMessage($sender, $receiver, $content);
MessageService::createMessage($msg);
}
}
4.消息处理
使用 Message\Service\MessageService::handleMessage($msg_id)
处理(发送)消息
4.1 手动处理一条消息
use Message\Service\MessageService;
class TestController extends AdminBase {
//处理信息
function handleMessage() {
//取出未处理的消息,进行处理
$messages = D('Message/Message')->where(['process_status' => MessageModel::PROCESS_STATUS_UNPROCESS])->field('id')->select();
foreach ($messages as $index => $message) {
MessageService::handleMessage($message['id']);
}
}
}
4.2 使用计划任务执行【推荐】
或者你可以添加计划任务,Message/CronScript/HandleMessage
,建议每隔1分钟处理一次。执行延迟为分钟级别。
4.3 使用命令行执行【推荐】
使用命令行可以创建多个处理消息进程,可以应付海量的消息处理。执行延迟为秒级别。
# 启动
php index.php /Message/Cli/start
# 平滑停止(请务必使用这种方式停止,否则任务没有结束就强制结束会有产生系统异常,脏数据等)
php index.php /Message/Cli/stop
最佳实践与提示
- 有多少不同类型的消息就建多少种 Message
- 有多少个消息分发渠道就建多少种 Sender
- 其实 Sender 相当于一个事件处理器(Handler),不要认为只能用来发消息(模板消息,短信等)
- Message 里
setContent()
,setReceiver()
,setTarget()
都不是必须,只是传入对应的参数方便 Sender 中自由的根据消息的来源信息自由修改发送内容
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论