国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何使用定時器功能,每間隔一段時間,給用戶發(fā)送消息

whhema

如何在workerman的Demo的基礎上,實現(xiàn) 每間隔一段時間,服務器向指定的用戶推送消息數(shù)據(jù)。
如何把定時代碼和workerman的代碼結(jié)合起來?

23020 1 0
1個回答

walkor 打賞

首先 講解下如何在其它項目中通過workerman向客戶端轉(zhuǎn)發(fā)數(shù)據(jù)(只針對Gateway/Worker模型開發(fā)的應用 如applications/Demo、workerman-chat、workerman-todpole等)

以applications/Demo為例
在其它項目中(比如apache運行的web項目),只要將applications/Demo這個文件夾拷貝到你的項目下,然后include Demo/Lib/Gateway.php ,然后直接使用\Lib\Gateway::sendToClient \Lib\Gateway::sendToAll 發(fā)送向客戶端數(shù)據(jù)了

如何定時
定時最簡單的方法是通過 linux的cron來做,也就是定時運行一下php的腳本。缺點是corn腳本最小時間間隔為1分鐘,如果時間間隔符合你的需求則可以使用cron,具體操作可以百度下

如果你需要秒級別的定時,則可以使用php腳本來做。php腳本里面一個while死循環(huán),里面配合sleep/usleep。然后運行nohup php youcron.php & 就一直后端運行了。缺點是如果腳本寫的不健壯,出現(xiàn)FatalError這個腳本就被終止了

也可以使用workerman來做定時,workerman中有一個設定定時任務的接口 \Man\Core\Lib\Task 可以在workerman中直接調(diào)用。

用workerman做定時任務

首先新建一個進程文件,假如有兩個定時任務,一個是每2秒向所有客戶端發(fā)送一段數(shù)據(jù),另外一個是每隔10秒向所有客戶端發(fā)送一段數(shù)據(jù)
新建一個文件 applications/Demo/Task.php

<?php
/*
 *  一個定時任務,向通過workerman定時向客戶端發(fā)送數(shù)據(jù)
 */
// 向客戶端發(fā)送數(shù)據(jù)必須載入這個類
require_once __DIR__ . '/Lib/Gateway.php';

class Task extends Man\Core\SocketWorker
{
    // 子進程啟動時會運行onStart, 整個進程生命周期只運行一次,這里用來注冊定時任務
    public function onStart()
    {
        // 初始化定時任務,讓$this->event負責定時觸發(fā)
        \Man\Core\Lib\Task::init($this->event);

        // 定時任務1的時間間隔2秒
        $time_interval1 = 2;
        // 設定定時任務
        \Man\Core\Lib\Task::add($time_interval1, function(){
            // 任務邏輯,這里只發(fā)了一個字符串
            \Lib\Gateway::sendToAll("I'm Task 1\n");
        });

        // 定時任務2的時間間隔10秒
        $time_interval2 = 10;
        // 設定定時任務,定時運行 $this->dealProcess();
        \Man\Core\Lib\Task::add($time_interval2, array($this, 'taskTwo'));
    }

    // 另外一個要定時運行的類成員函數(shù)
    public function taskTwo()
    {
       \Lib\Gateway::sendToAll("I'm Task 2\n");
    }

    // 這里不接收請求,函數(shù)留空
    public function dealInput($recv_buffer){}

    // 這里不接收請求,函數(shù)留空 
    public function dealProcess($recv_buffer){}
}

然后新建一個配置進程文件
applications/Demo/conf.d/Task.conf

;定時任務進程入口文件
worker_file = ../Task.php
;啟動多少進程,定時任務一般是一個進程,也可以開多個但是要注意多進程會不會給你帶來并發(fā)問題
start_workers=1
;以哪個用戶運行這個worker進程,要設置成權限較低的用戶,如 www-data nobody
user=root

最后啟動workerman并測試
運行 ./workerman/bin/workermand restart
然后運行telnet 127.0.0.1 8480
就可以看到定時任務的效果了,類似如下

telnet 127.0.0.1 8480
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
type in your name:
ff
chat room login success, your client_id is 7, name is ff
use client_id:words send message to one user
use words send message to all
ff come
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 2
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 1
I'm Task 2
  • 暫無評論
年代過于久遠,無法發(fā)表回答
??