1、網(wǎng)站頁面建立與GatewayWorker的websocket連接
2、GatewayWorker發(fā)現(xiàn)有頁面發(fā)起連接時(shí),將對應(yīng)連接的client_id發(fā)給網(wǎng)站頁面
3、網(wǎng)站頁面收到client_id后觸發(fā)一個(gè)ajax請求(假設(shè)是bind.php)將client_id發(fā)到mvc后端
4、mvc后端bind.php收到client_id后利用GatewayClient調(diào)用Gateway::bindUid($client_id, $uid)將client_id與當(dāng)前uid(用戶id或者客戶端唯一標(biāo)識(shí))綁定。如果有群組、群發(fā)功能,也可以利用Gateway::joinGroup($client_id, $group_id)將client_id加入到對應(yīng)分組
5、頁面發(fā)起的所有請求都直接post/get到mvc框架統(tǒng)一處理,包括發(fā)送消息
6、mvc框架處理業(yè)務(wù)過程中需要向某個(gè)uid或者某個(gè)群組發(fā)送數(shù)據(jù)時(shí),直接調(diào)用GatewayClient的接口Gateway::sendToUid Gateway::sendToGroup 等發(fā)送即可。
上面步驟已經(jīng)完成,使用Gateway::bindUid($client_id, $uid);也可以發(fā)送成功。
接下來我想使用Timer定時(shí)器根據(jù)前端用戶傳來的參數(shù)從數(shù)據(jù)庫讀取相應(yīng)數(shù)據(jù)定時(shí)發(fā)送,該如何實(shí)現(xiàn),麻煩指教一下。 mca后端貌似不能直接使用Timer?
直接通過 Gatewayworker 綁定用戶和群組就可以了,為什么還要通過其它框架?在你打開頁面的時(shí)候就可以從你的 web 服務(wù)器(也就是你說的其它框架那里)獲取對應(yīng)的用戶資料,直接發(fā)給 Gatewayworker 就行,自己定義好 $message,例如 $message 可以是一個(gè) json 字符串,通過 auth 字段驗(yàn)證,bindUid 字段綁定,sendToUid 字段獲取數(shù)據(jù)進(jìn)行發(fā)送。在 onWorkerStart 那里設(shè)置個(gè)定時(shí)器,當(dāng)接收到發(fā)送指令時(shí)就查詢數(shù)據(jù)進(jìn)行發(fā)送。
以上只是大概思路。
感謝您的回答,可能我描述得不太清楚, 我想實(shí)現(xiàn)的流程是這樣:前端用戶進(jìn)入某個(gè)商品A頁面后與Gatewayworker建立鏈接,請教的是接下去如何使用定時(shí)器定時(shí)給用戶發(fā)送商品A【如果進(jìn)入的是商品B就發(fā)商品B】的一些數(shù)據(jù)(數(shù)據(jù)通過數(shù)據(jù)庫讀取或者讀取緩存)
@7404:一樣道理啊,你進(jìn)入頁面之后就可以從 web 服務(wù)器獲取到商品信息,你將 uid 和 商品 id 一起發(fā)到 gatewayworker 不就得了,自己用 composer 在 gatewayworker 引入數(shù)據(jù)庫操作庫,然后通過定時(shí)器查詢數(shù)據(jù)發(fā)送
有些開發(fā)者習(xí)慣了tp寫業(yè)務(wù)。
需求描述的有點(diǎn)粗糙。
把定時(shí)任務(wù)(包括發(fā)送時(shí)間)存在數(shù)據(jù)庫里,用workerman開一個(gè)進(jìn)程,定時(shí)(比如每秒)http訪問tp的一個(gè)地址,tp里讀數(shù)據(jù)庫找到到了時(shí)間的定時(shí)任務(wù),然后執(zhí)行。