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

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

whhema

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

23112 1 0
1個(gè)回答

walkor 打賞

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

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

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

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

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

用workerman做定時(shí)任務(wù)

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

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

class Task extends Man\Core\SocketWorker
{
    // 子進(jìn)程啟動(dòng)時(shí)會(huì)運(yùn)行onStart, 整個(gè)進(jìn)程生命周期只運(yùn)行一次,這里用來注冊定時(shí)任務(wù)
    public function onStart()
    {
        // 初始化定時(shí)任務(wù),讓$this->event負(fù)責(zé)定時(shí)觸發(fā)
        \Man\Core\Lib\Task::init($this->event);

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

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

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

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

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

然后新建一個(gè)配置進(jìn)程文件
applications/Demo/conf.d/Task.conf

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

最后啟動(dòng)workerman并測試
運(yùn)行 ./workerman/bin/workermand restart
然后運(yùn)行telnet 127.0.0.1 8480
就可以看到定時(shí)任務(wù)的效果了,類似如下

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
  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??