* [什么是上下文处理?](http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=541#什么是上下文处理?)
* [上下文工作方式](http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=541#上下文工作方式)
* [示例展示](http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=541#示例展示)
* [上下文实现原理](http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=541#上下文实现原理)
#### 什么是上下文处理?
首先您先查看并了解了微擎的[消息响应流程](http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=545),明白消息的响应是通过“关键字”进行响应的。
比如,管理员设定好一系列的回复规则,当用户输入:“今天天气是什么”,系统回复:“今天是晴天”。
此处的“今天天气是什么”就是一个关键字,并且这个关键字是有意义的,管理员完全可以揣测出来用户在输入这句话期望得到的结果是“今天是晴天”。
所以管理员可以通过设置关键字回复来达到人机交互。
但是好些时候用户输入的关键字是需要通过上下文的理解来确定用户的意图。
比如,用微信打印照片,用户先输入:“打印照片”,系统回复:“请发送一张照片”,用户发送一张照片,系统回复:“照片正在打印”。
如果没有这样的交互,用户直接发送一张照片过来,系统无法得知用户是要打印照片,还是要使用其它什么模块功能。
所以微擎提供了上下文锁定来处理此类需求
#### 上下文工作方式
* 上下文回复仅可以在 WeModuleProcessor 的继承类中使用。
* 当管理设置一条规则触发到该模块的Processor中,可以过通$this->beginContext();来锁定上下文会话。
* 锁定会话后,后面无论用户输入什么内容,均会被直接触发到该模块的Processor中。
* 模块进行一系列的交互与处理后,可以通过 this->endContext(); 来解锁上下文会话。
* 用户输入的关键字继续正常的被其它模块接收。
#### 示例展示
下面的示例将演示根据血型查性格的简单例子:
~~~
class BloodTestModuleProcessor extends WeModuleProcessor { //void: 所有处理程序必须实现虚函数 respond. 用以响应消息 public function respond() { if(!$this->inContext) { $reply = '请输入你的血型(A, B, O, AB), 来分析你今年的运程. '; $this->beginContext(); // 如果是按照规则触发到本模块, 那么先输出提示问题语句, 并启动上下文来锁定会话, 以保证下次回复依然执行到本模块 } else { $btypes = array('a', 'b', 'o', 'ab'); $b = strtolower($this->message['content']); // 如果当前会话在上下文中, 那么表示当前回复是用户回答提示问题的答案. if(in_array($b, $btypes)) { switch($b) { case 'a': $reply = 'A型血今年.....'; break; case 'b': $reply = 'B型血今年.....'; break; case 'o': $reply = 'O型血今年.....'; break; case 'ab': $reply = 'AB型血今年.....'; break; } $this->endContext(); // 如果当前回答符合答案格式, 那么进行保存并进行下一个问题. (可以保存至 SESSION 中) // 直到最后一个问题回答完成, 输出测试结果给用户, 并结束对话锁定. 以保证用户其他对话能正常路由. // 本示例只有一个问题, 因此不保存答案, 直接输出测试结果. // 如果对话默认的超时不够, 那么可以在每次提出下一个问题的时候重新调用 beginContext 来顺延超时. } else { $reply = '请输入正确的血型(A, B, O, AB). '; // 回答不符合答案格式, 那么重新显示当前问题. } } return $this->respText($reply); }}
~~~
#### 上下文实现原理
微擎的上下文操作使用**$\_SESSION + DB**来实现.
上下文数据保存在**$\_SESSION\[‘context’\]**变量中,并与**sessions**表中数据做一对一的映射,用户可通过操作 sessions 表中的数据进行上下文会话的基本管理.
要实现上下文操作主要使用**Processor**里的内定方法:
* **public $inContext;**
本次对话是否为上下文响应对话, 如果当前对话是由上下文锁定而路由到的. 此值为**true**, 否则为**false**
* **protected function beginContext($expire = 3600);**
请在模块处理程序中调用此函数已开始一个新的上下文对话.
附加的参数 $expire 说明本次会话的失效时间.
例如 $this->beginContext(1800) 就说明启动一次上下文会话锁定, 并且本次会话将会于30分钟后释放, 如果不固定超时的话, 请在每次请求时调用 beginContext
* **protected function endContext();**
在模块处理程序中调用**endContext**来**结束**一次会话, 并**销毁**会话中保存的所有数据(当前为 $\_SESSION)
* **protected function refreshContext($expire = 0);**
**在模块处理程序中调用**refreshContext\*\* 来刷新用户处于上下文的时限. 超过时限用户将会自动退出上文环境.
- 微信消息
- 概述
- 响应流程
- 入门指引
- 安装微擎
- 环境安装
- 百度云(微擎镜像)
- 宝塔(Linux)推荐
- 注册云服务
- 代码规范
- php编码规范
- 数据库设计
- 文件目录规范
- JavaScript编辑码规范
- 微擎框架
- 目录结构
- 数据库字典
- 配置选项
- 数据库配置
- 系统COOKIE配置项
- 系统设置
- 上传配置 (已废弃,统一在系统附件设置中更改)
- 预定义常量
- 全局变量
- 全局配置
- 系统配置
- 公众号相关
- Web 端可见
- App 端可见
- 网页授权
- URL 路由
- url
- createMobileUrl
- createWebUrl
- 文件加载器
- func
- class
- model
- web
- app
- library
- object
- singleton
- 缓存机制
- cache_write
- cache_load
- cache_delete
- cache_clean
- cache_system_key
- 数据库
- SQL注入安全
- 连接其它数据库
- 数据库函数列表
- pdo_get
- pdo_getcolumn
- pdo_getall
- pdo_getslice
- pdo_fetch
- pdo_fetchcolumn
- pdo_fetchall
- pdo_insert
- pdo_update
- pdo_delete
- pdo_query
- pdo_run
- pdo_fieldexists
- pdo_indexexists
- pdo_tableexists
- pdo_fieldmatch
- pdo_debug
- 链式查询
- from
- select
- where
- whereor
- having
- groupby
- orderby
- leftjoin
- innerjoin
- on
- limit
- page
- get
- getall
- getcolumn
- count
- exists
- getLastQueryTotal
- getLastQuery
- 错误处理
- 日志记录
- 模板引擎
- 模板标签
- 输出变量
- 判断语句
- 循环语句
- php语句
- 引用模板
- 创建URL
- 转义附件URL
- 输出花括号
- 数据调用
- 调用微站导航
- 调用幻灯片
- 调用文章列表
- 调用文章评论
- 调用分类列表
- 调用快捷菜单
- 常用变量
- 函数列表
- 系统公共函数
- istripslashes
- ihtmlspecialchars
- isetcookie
- token
- random
- checksubmit
- checkcaptcha
- tablename
- array_elements
- range_limit
- ijson_encode
- iserializer
- iunserializer
- is_base64
- is_serialized
- wurl
- murl
- pagination
- tomedia
- referer
- strexists
- cutstr
- istrlen
- emotion
- authcode
- sizecount
- bytecount
- array2xml
- xml2array
- scriptname
- utf8_bytes
- isimplexml_load_string
- aes_decode
- aes_encode
- ihtml_entity_decode
- iarray_change_key_case
- parse_path
- strip_gpc
- to_global_media
- 参数安全函数
- 业务公共函数
- Http请求函数
- ihttp_request
- ihttp_get
- ihttp_post
- ihttp_email
- 文件操作函数
- file_write
- file_read
- file_move
- file_tree
- file_copy
- file_upload
- file_wechat_upload
- file_remote_upload
- file_random_name
- file_delete
- file_remote_delete
- file_image_thumb
- file_image_crop
- file_lists
- file_remote_attach_fetch
- file_is_image
- mkdirs
- rmdirs
- 数据库维护函数
- db_table_schema
- db_table_serialize
- db_table_create_sql
- db_schema_compare
- db_table_fix_sql
- _db_build_index_sql
- _db_build_field_sql
- db_table_schemas
- db_table_insert_sql
- Web端公共函数
- url web
- message
- checklogin
- checkaccount
- template
- App端公共函数
- url app
- checkauth
- message app
- template app
- register_jssdk
- 安全操作函数
- 模板组件列表
- Web端组件
- _tpl_form_field_date
- tpl_form_field_link
- tpl_form_module_link
- tpl_form_field_emoji
- tpl_form_field_color
- tpl_form_field_icon
- tpl_form_field_image
- tpl_form_field_multi_image
- tpl_form_field_audio
- tpl_form_field_multi_audio
- tpl_form_field_video
- tpl_form_field_wechat_image
- tpl_form_field_wechat_multi_image
- tpl_form_field_wechat_voice
- tpl_form_field_wechat_video
- tpl_form_field_location_category
- tpl_ueditor
- tpl_edit_sms
- tpl_coupon_colors
- App端组件
- _tpl_form_field_date app
- tpl_app_fans_form
- tpl_app_form_field_calendar
- tpl_app_form_field_district
- tpl_app_form_field_avatar
- tpl_app_form_field_image
- tpl_app_coupon_item
- 系统公共组件
- tpl_form_field_date
- tpl_form_field_clock
- tpl_form_field_daterange
- tpl_form_field_calendar
- tpl_form_field_district
- tpl_form_field_category_2level
- tpl_form_field_industry
- tpl_form_field_coordinate
- tpl_fans_form
- 支付API
- 发起支付(PHP)
- 发起支付(JS)
- 验证支付
- 退款(微信、支付宝)
- 微信API
- 基础
- 粉丝(公众号)
- fansAll
- fansQueryInfo
- fansBatchQueryInfo
- 粉丝标签(公众号)
- fansTagAdd
- fansTagFetchAll
- fansTagEdit
- fansTagDelete
- fansTagGetUserlist
- fansTagTagging
- fansTagBatchTagging
- fansTagBatchUntagging
- fansTagFetchOwnTags
- 自定义菜单(公众号)
- menuCreate
- menuDelete
- menuCurrentQuery
- menuQuery
- 二维码(公众号)
- barCodeCreateDisposable
- barCodeCreateFixed
- 客服消息(公众号)
- 模板消息(公众号)
- 群发(公众号)
- fansSendAll
- fansSendPreview
- 临时素材(公众号)
- uploadMedia
- downloadMedia
- 永久素材(公众号)
- uploadMediaFixed
- addMatrialNews
- uploadNewsThumb
- uploadVideoFixed
- editMaterialNews
- getMaterial
- getMaterialCount
- delMaterial
- batchGetMaterial
- 短网址(公众号)
- 共享收货地址(公众号)
- JSSDK(公众号)
- 自定义分享(公众号)
- 小程序码
- getCodeLimit
- getCodeUnlimit
- 云服务API
- 本地调试
- 键值对存储
- 查询模块信息
- 查询站点信息
- 发短信
- 常见问题
- 设置开发模式
- 调试sql语句
- 微信图片盗链
- mac系统压缩包无法上传
- reditect_url 参数错误
- GIT发布(上传大文件)
- 共享包
- iframe跨域解决方案
- 更新出错如何恢复
- 小程序开发
- 与微擎通信
- 模块中定义文件
- 接口验签
- PHP接口返回值
- 接口版本
- session机制
- 发起支付
- util.js工具库
- util.url
- util.request
- util.getUserInfo
- util.navigateBack
- util.footer
- util.message
- util.showLoading
- util.showImage
- util.parseContent
- util.date
- isLeapYear
- dateToStr
- dateAdd
- dateDiff
- dateToLong
- longToDate
- isDate
- getMaxDay
- toArray
- datePart
- maxDayOfDate
- util.md5
- util.base64Encode
- util.base64Decode
- app.js
- 获取用户信息
- 应用开发
- 机制说明
- 命名空间
- 定义微擎首页
- 智能应答
- 自定义分享
- 分离代码
- 粉丝信息
- manifest.xml
- install.php和upgrade.php
- 设计应用
- 全局变量1
- MODULE_URL
- MODULE_ROOT
- $_W[current_module]
- 安装、更新与卸载
- 发布应用
- 功能文件
- module.php
- site.php
- wxapp.php
- result
- webapp.php
- mobileapp.php
- hook.php
- receiver.php
- systemwelcome.php
- 支付
- 在php中发起支付
- 在微信浏览器中发起
- 在小程序中发起
- 验证支付结果
- 云商城常见问题
- 发布应用1
- 应用文档结构
- manifest.xml -
- 发布应用错误提示
- git 大文件发布
- 云Api发布
- 对外接口
