<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] #### 什么是上下文處理? 首先您先查看并了解了微擎的[消息響應流程](http://www.hmoore.net/donknap/we7/134650),明白消息的響應是通過“關鍵字”進行響應的。 比如,管理員設定好一系列的回復規則,當用戶輸入:“今天天氣是什么”,系統回復:“今天是晴天”。 此處的“今天天氣是什么”就是一個關鍵字,并且這個關鍵字是有意義的,管理員完全可以揣測出來用戶在輸入這句話期望得到的結果是“今天是晴天”。 所以管理員可以通過設置關鍵字回復來達到人機交互。 但是好些時候用戶輸入的關鍵字是需要通過上下文的理解來確定用戶的意圖。 比如,用微信打印照片,用戶先輸入:“打印照片”,系統回復:“請發送一張照片”,用戶發送一張照片,系統回復:“照片正在打印”。 如果沒有這樣的交互,用戶直接發送一張照片過來,系統無法得知用戶是要打印照片,還是要使用其它什么模塊功能。 所以微擎提供了上下文鎖定來處理此類需求 #### 上下文工作方式 * 上下文回復僅可以在 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** 來刷新用戶處于上下文的時限. 超過時限用戶將會自動退出上文環境.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看